一个关于java初始化的问题

先来看这道题目吧,执行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

猜你喜欢

转载自blog.csdn.net/hubert_bing/article/details/75542969