【发布时间】:2013-08-13 23:46:55
【问题描述】:
考虑以下代码段:
class A{ /* assume static and non static block are here */ }
class B extends A{ /* assume static and non static block are here */ }
在main方法中,
new B();
所以初始化的顺序是:
- A 类的静态成员初始化
- B 类的静态成员初始化
- A 类的非静态成员初始化
- 然后执行构造函数A里面的代码
- B 类的非静态成员初始化
- 然后执行构造函数B中的代码
现在看看这段代码,
class A{
A(){
this.m(); //line 1
}
void m(){
System.out.println("A.m()");
}
}
class B extends A{
void m(){
System.out.println("B.m()");
}
}
在main方法中,
new B();
在执行构造函数A的代码时,它只能看到类A中的方法m,因为类B的非静态成员还没有被初始化(按照我提到的顺序)。 然而结果是“B.m()”。 (子类的方法已经执行) 考虑到我提到的顺序,有人可以解释这里发生了什么(方法覆盖)吗?
【问题讨论】:
-
This 应该会带来一些清晰,尽管它不是完全重复的。
-
你应该从不,从不,从不在构造函数/析构函数中调用虚方法。这是明确糟糕、糟糕的主意。调用
final实例方法可能是okay,但我通常认为这是一个bad 的想法,并尽可能避免它。这是一个非常可怕的想法,它在 Scott Meyer 的 Effective C++ 中有介绍,虽然您的问题 是关于 Java,但他在此处给出的主要原因适用于此。不要这样做。 -
另外你可能想通过Relevant JLS Section
标签: java overriding