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


    1、首先列出代码

          Base.java

    public class Base
    {
        Base() {
            preProcess();
        }
     
        void preProcess() {}
    }

          Derived.java

    public class Derived extends Base
    {
        public String whenAmISet = "set when declared";
     
        @Override void preProcess()
        {
            whenAmISet = "set in preProcess()";
        }
    }
    

          Main.java

    public class Main
    {
        public static void main(String[] args)
        {
            Derived d = new Derived();
            System.out.println( d.whenAmISet );
        }
    }

    2、执行结果



    3、原因

          可參考http://blog.csdn.net/jltxgcy/article/details/17398751

          1、调用父类全局变量初始化,这里没有全局变量也不用初始化。

          2、调用父类构造函数,里面调用了子类的成员函数preProcess,whenAmISet被设置为"set in preProcess"

          3、调用子类全局变量初始化,whenAmISet被设置为"set when declared"。

          4、调用子类的构造函数。


    4、番外

         假设全局变量whenAmISet,没有设置初始化值。那么会设置为默认值。

    对象为null,int为0。

         局部变量。不会设置初始化值。须要显示设置,不能直接使用。

          C++构造函数初始化列表必需要显示初始化參数。

    和Java不同。

  • 相关阅读:
    A
    E
    C
    A
    exgcd
    博客
    简单数论
    extended_gcd(扩展欧几里德算法) 青蛙的约会
    扩展欧几里德算法—求解不定方程,线性同余方程
    素数筛 E
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7084759.html
Copyright © 2020-2023  润新知