一个关于java初始化的问题

来源:互联网 发布:女生学什么舞蹈知乎 编辑:程序博客网 时间:2024/05/22 08:52

先来看这道题目吧,执行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,最终输出的话应该是:

2true

但是注意:子类中有这样一个方法:

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

原创粉丝点击