java 对象的初始化顺序

来源:互联网 发布:财务审计软件oa 编辑:程序博客网 时间:2024/05/16 14:29

1、在通过new创建对象时调用了类的构造函数进行类对象的初始化。在运行时刻可以调用方法或者执行某些动作来确定初始值,这种方式为编程带来了很大的灵活性。但是这种方式无法阻止自动初始化的进行,他将在够构造器之前进行初始化

如下面的代码:

public class test1 {int i;public test1(){System.out.println(i);i++;}}
在上面的程序运行结果 被打印出的值应该是0 ;原因在构造起初始一前类变量就进行初始化。对于基本类型和引用类型或者已经进行手动赋值的变量,这种情况都是成了(变量的初始化先于 构造器的初始化 并且没有手动赋值的变量java 默认进行初始化赋值  注意:这里说的都是类成员变量  对于局部变量或方法体内的变量不成立的),所以java编译器不会再你使用变量前请强制你去给变量赋值-----由于变量已经被默认初始化了

2、java 创建对象时初始化顺序  看下面代码运行结果 类成员变量分布在 java 类的各个位置

import static net.mindview.util.Print.*;// When the constructor is called to create a// Window object, you'll see a message:class Window {  Window(int marker) { print("Window(" + marker + ")"); }}class House {  Window w1 = new Window(1); // Before constructor  House() {    // Show that we're in the constructor:    print("House()");    w3 = new Window(33); // Reinitialize w3  }  Window w2 = new Window(2); // After constructor  void f() { print("f()"); }  Window w3 = new Window(3); // At end}public class OrderOfInitialization {  public static void main(String[] args) {    House h = new House();    h.f(); // Shows that construction is done  }}

运行结果:

Window(1)Window(2)Window(3)House()Window(33)f()

从运行结果可以看出 house 类中定义的 window 三个引用变量成员 初始化的顺序都要早于 house 类的构造函数的初始化 

另外也可以通过 代码块进行变量初始化写法如下:

class House {  Window w1; // Before constructor   House() {    // Show that we're in the constructor:  System.out.println("House()");    w3 = new Window(33); // Reinitialize w3  }  Window w2;// After constructor  void f() { System.out.println("f()"); }  Window  w3; // At end    {  w1 =  new Window(1);  w3 = new Window(3);  w2 = new Window(2);   }}public class OrderOfInitialization {  public static void main(String[] args) {    House h = new House();    h.f(); // Shows that construction is done  }}class Window {  Window(int marker) { System.out.println("Window(" + marker + ")"); }}

运行结果

Window(1)Window(3)Window(2)House()Window(33)f()

从运行结果看同过代码块进行初始化类成员变量也是可以的    代码块
 {  w1 =  new Window(1);  w3 = new Window(3);  w2 = new Window(2);   }


总结:类初始化属性 是类成员变量自动初始化完成在进行构造函数的初始化   ; static 修饰的方法和类成员变量在类加载时就进行了初始化

原创粉丝点击