为什么变量打印不正确?

Mal*_*nda 0 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();
     }
 }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

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

  • 拨电至 new B()
  • 开始初始化实例B:
  • 隐含地打电话 super()
    • 开始初始化实例 A
    • 将字段初始化A.a为100
    • 呼叫myMethod,被覆盖B
    • 打印出来的B.a是0
    • A 构造函数返回
  • 将字段初始化B.a为200
  • 执行B构造函数的主体,它是空的

如您所见,printlnB.a字段尚未初始化时,您的呼叫就会发生.

这就是为什么myMethod()从构造函数中执行已被覆盖(在您的情况下)的方法是如此危险 - 它最终可能会使用尚未完成正常初始化的状态.