class A {
String name = isName(); String isName() {
System.out.println("222222222");
return null;
} A() {
System.out.println("333333333");
}
}class B extends A {
String name = isName(); String isName() {
super.isName();
System.out.println("1111111111");
return "aa";
}
}class Demo {
public static void main(String[] args) {
A b = new B();
}
}
222222222 1111111111 333333333 222222222 1111111111 运行结果, 为什么会这样呢,请给解释下?
String name = isName(); String isName() {
System.out.println("222222222");
return null;
} A() {
System.out.println("333333333");
}
}class B extends A {
String name = isName(); String isName() {
super.isName();
System.out.println("1111111111");
return "aa";
}
}class Demo {
public static void main(String[] args) {
A b = new B();
}
}
222222222 1111111111 333333333 222222222 1111111111 运行结果, 为什么会这样呢,请给解释下?
A b = new B(); 时,应该追溯父类A的构造函数,在调用A构造函数之前,会执行属性的初始化,也就是A类中的String name = isName(); ,由于这里的isName()方法被子类重写了,所以这里调用的是子类的isName()方法,即String isName() {
super.isName();
System.out.println("1111111111");
return "aa";
} 因此首先就打印出 222222222 1111111111然后,调用父类A构造函数打印出333333333 ,
最后调用子类B的构造函数,在调用构造函数之前同样对属性进行初始化,调用isName(),结果又打印出222222222 1111111111因此,结果就是如你所看到的一样了,呵呵,注意红色部分。
1、执行自身的构造函数,print null
2、执行类中的其他定义 print a.isName() =>22..,11..
3、执行父类的构造函数,print 33..
4、执行父类中的其他定义,注意 A中的isName函数已经被B重置了,所以最后是执行B中的isName print 22..,11..