前几天和一大学同学聊天,被问到一个有意思的问题。
问我输出的是什么,我想当然的答A,结果错了。应该是B。
又做了个小实验,将class A改成抽象类、p()改成抽象方法,是同样的调用顺序。
由此得出,java的继承中调用构造方法时,使用的是就近原则。
public class A {
public A() {
p();
}
protected void p() {
System.out.println("A");
}
}
class B extends A {
@Override
protected void p() {
System.out.println("B");
}
public static void main(String[] args) {
new B();
}
}
问我输出的是什么,我想当然的答A,结果错了。应该是B。
又做了个小实验,将class A改成抽象类、p()改成抽象方法,是同样的调用顺序。
abstract public class A {
public A() {
p();
}
protected abstract void p();
}
class B extends A {
@Override
protected void p() {
System.out.println("B");
}
public static void main(String[] args) {
new B();
}
}
由此得出,java的继承中调用构造方法时,使用的是就近原则。