先来看这道题目吧,执行main方法会输出的是什么?
public class FieldTest {
private int a = 1;
private boolean b = true;
public FieldTest() {
a = 2;
print();
}
public void print() {
System.out.println(a);
System.out.println(b);
}
public static class FieldTestSub extends FieldTest {
private boolean c = true;
public void print() {
System.out.println(c);
}
}
public static void main(String[] args) {
new FieldTestSub();
}
}
来给你点时间思考
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
思考差不多了吧~先告诉你答案:
false
都做对了吗?没有的话就好好看看接下来的分析吧~
我们从main方法开始,其中只有new FieldTestSub();
创建了FildTestSub对象,就会走相应的构造,class如果没有显示的有参构造,默认会有一个无参构造
public FieldTestSub() {
}
如果有该class有父类的话构造中又默认有super();
表示调用父类的构造,而父类的构造中
public FieldTest() {
a = 2;
print();
}
为a变量赋值,然后调用print方法
public void print() {
System.out.println(a);
System.out.println(b);
}
print方法则输出了a,b变量的值
a,b成员变量在申明的时候就赋值,该赋值是优先于构造生效的,因此a的值先是1,然后在构造中又变成了2,最终输出的话应该是:
2
true
但是注意:子类中有这样一个方法:
public void print() {
System.out.println(c);
}
该方法与父类的方法print同名且参数一致,表示重写了父类的print方法。
在父类构造调用的print方法隐藏了调用的对象,即this.print();
而这个this是谁那?还记得在main方法中new的对象吗?
this其实就是FieldTestSub的对象,调用的this的print方法执行的实际执行的是:
System.out.println(c);
那就是true
嘛,在申明的时候直接赋的值private boolean c = true;
但是print方法是在父类的构造中执行的,此时子类还没有初始化,因此变量c还是最初值false,最终输出的结果:false