请写出最后输出的结果
.public class A {
String name ="A";
public A() {
print();
}
public void print(){
System.out.println("name");
}
}public class B extends A{
String name="B";
public B() {
print();
}
public void print(){
System.out.println(name);
}
public static void main(String[] args) {
new B();
}
}
一些人觉得 输出的结果为:
A
B
其思路为: 当子类的构造函数被调用时,
其会隐式的调用其父类的构造函数(通过super() 函数调用),
于是父类的构造函数会调用 print()方法
,因此打印的为A
然后父类的构造函数执行完后 回到子类的构造函数
再初始化 子类的成员变量
最后调用子类的print()方法打印 B
但是当我们在运行这个程序的时候 我们却发现 输出的结果为
null
B
那么问题究竟出在哪里呢?
接下来我们分析一下整个执行的过程,也就是new B();这个操作背后到底做了什么
1.首先 进入 B 的构造函数
2.为 B 的成员变量分配内存(此时还没有进行初始化)
3. A 的构造函数被隐式的调用
4. 为A的成员变量分配内存(相当于 String name 仅仅是在内存中占个位置)
5.初始化A的成员变量 即 name = "A";
6.调用 print()方法
7.执行B的print()方法
8.输出null
9.再回到B的构造函数
10.初始化B的成员变量 name="B";
11.调用 print()方法
12.执行B的print()方法
13.输出B个人觉得 以上有两点需要注意的
第一点:就是当进入父类的构造函数中调用print()方法的时候 其实调用的是子类的print()方法
因为父类的构造器中的方法是在子类中调用的 而且子类重写了print()方法 所以当然调用的是子类的方法
第二点:就是
String name ="B";
public B() {
print();
}
这段代码在执行的过程中其实是这样的
String name;
public B() {
super();
name="B";
print();
}