zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    如何在SQL Server 2005 中为安装程序增加计数器注册表项值
    C++ 基础小知识学习[1]
    同时支持火狐和IE的输入框内容改变事件
    3D圆角
    Jquery选择器测试
    asp.net 中的 MD5加密和DES加解密算法类
    简单页面控件赋值
    继承IHttpHandler接口实现给网站图片添加水印
    asp.net Ajax
    JQuery操作iframe父页面与子页面的元素与方法
  • 原文地址:https://www.cnblogs.com/personnel/p/4584891.html
Copyright © 2011-2022 走看看