类的成员变量初始化

来源:互联网 发布:易名中国域名交易 编辑:程序博客网 时间:2024/05/24 06:31
类的成员变量初始化:
类的每个基本类型数据成员保证都会有一个初始值
在类中定义的一个对象引用时,如果不将其初始化,此引用就会获得一个特殊的初始值null

可以在定义类成员变量的地方为其赋值(C++不行)

无法阻止自动初始化的进行,它将在构造器被调用之前发生

在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化

初始化的顺序是先静态对象,而后“非静态”对象

静态初始化只在class对象首次加载的时候进行一次

程序运行之前,基类的static成员变量先被初始化;
再次为派生类的static成员变量;
之后,程序运行基类的普通成员变量初始化,调用基类的构造函数;
最后,派生类的成员变量初始化,派生类的构造函数执行。

以下摘自http://blog.sina.com.cn/s/blog_44c1e6da0100bk5j.html
初始化的顺序是先“静态”,(如果它们尚未因前面的对象创建过程而被初始化),后“非静态”。
具体的创建过程:
1.当首次创建某个类对象的时候,或者该类的静态方法/静态域首次被访问时,Java解释器必须查找该类的路径,以定位该类的class文件。
2.然后载入该class(创建一个Class对象),有关静态初始化的动作都会执行。静态初始化只在Class对象首次加载的时候进行一次。
3.当使用new操作符创建对象的时候,首先将在堆上为待创建的对象分配足够的存储空间。
4.这块存储空间会被清零,这就自动的将类中所有基本类型数据设置成了默认值(数值和字符是0,布尔是false),而引用则被设置成了null。
5.按出现顺序执行所有出现于域(非静态域)定义处的初始化动作。
6.执行构造器。

在类被继承的情况下,初始化的顺序:
1.初始化子类,类加载器在加载它的时候会发现它继承了另外一个类,类加载器要先把父类加载进来。于是开始加载父类,父类的静态部分被按顺序加载。之后子类的静态部分被加载。这样的顺序是考虑子类的静态域可能会依赖父类的静态域;
2.父类的非静态部分被加载;
3.子类指定的父类的构造器;
4.子类的非静态部分被加载;
5.子类构造器的其余部分。
多个层次的继承关系,顺序也同理。

0 0
原创粉丝点击