Java构造时成员初始化的陷阱

今天看到一篇标题:“Java构造时成员初始化的陷阱”的文章:http://coolshell.cn/articles/1106.html

 

自已写了一个简单的程序测试了一下:

 

public final class Test
{
    public Test()
    {
        B b = new B();  
             
        System.out.println(b.name);
    }   
         
    class A
    {
        A()
        {
            System.out.println("A()");
            a();        
                 
        }
             
        void a()
        {
            System.out.println("A.a()");
        }
    }
         
    class B extends A
    {
        public String name= "张三";
             
        B()
        {           
            System.out.println("B()");
        }
             
        void a()
        {
            System.out.println("B.a()");
            name = "李四";
        }
    }   
         
    public static void main(String[] args)
    {       
        new Test();     
    }
}

运行输出的结果:

 

 

下面是对上面各个步骤的逐条解释:
进入构造函数。
为成员变量分配内存。
除非你显式地调用super(),否则Java 会在子类的构造函数最前面偷偷地插入super() 。
调用父类构造函数。
调用B.a(),因为被子类override,所以调用的是子类的。
于是,初始化发生在了a()之后。这是因为,Java需要保证父类的初始化早于子类的成员初始化,否则,在子类中使用父类的成员变量就会出现问题。
正式执行子类的构造函数(当然这是一个空函数,虽然我们没有声明)。

 

 

我当时看了也很意外,没想到会是这样的执行顺序和结果。

 

2013-05-11

posted @ 2015-06-18 08:36  personnel  阅读(214)  评论(0编辑  收藏  举报
友情链接:图片批量处理工具 gif动态图制作工具 制作电子相册 图片排版工具 制作淘宝主图视频 MKScript 鼠标键盘自动化脚本语言