为什么变量打印不正确?

时间:2017-06-26 04:08:41

标签: java class

为什么以下程序输出Method B 0而不是Method B 200?我无法理解我的问题是什么。

class A{
    int a=100;
    void myMethod(){
        System.out.println("myMethod of A : "+a);
    }
    A(){
        myMethod();//calling my method
    }
}
class B extends A{
    int a=200;
    void myMethod(){
        System.out.println("myMethod of B : "+a);
    }
 }
 class Demo{
     public static void main(String args[]){
         new B();
     }
 }

2 个答案:

答案 0 :(得分:7)

实例字段初始化程序在调用超类构造函数后运行。所以执行的顺序是:

  • 致电new B()
  • 开始初始化B的实例:
  • 隐含地致电super()
    • 开始根据A
    • 初始化实例
    • 将字段A.a初始化为100
    • myMethod
    • 中调用B
    • 打印出B.a 0
    • A构造函数返回
  • 将字段B.a初始化为200
  • 执行B构造函数的主体,该构造函数为空

正如您所看到的,当println字段尚未初始化时,您的B.a来电就会发生。

这就是为什么从构造函数中执行已被覆盖的方法(在你的情况下是myMethod())是如此危险 - 它最终可能会处理尚未经过正常初始化的状态。< / p>

答案 1 :(得分:0)

当您执行 new B()时,将调用A类的默认构造函数。 A类的构造函数调用类B的myMethod()函数。 此时,B类中 a 的值不会是200(它将为0),因为它是由A类的构造函数调用的。

要获得所需内容,您应该在B类中定义默认构造函数,并将myMethod称为。

 B(){
        myMethod();
    }