java 对象的初始化顺序

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

如下面的代码:

public class test1 {
int i;
public test1(){
	System.out.println(i);
	i++;}}

在上面的程序运行结果 被打印出的值应该是0 ;原因在构造函数初始以前类成员变量就优先进行初始化。对于基本类型和引用类型或者已经进行手动赋值的变量,这种情况都是先初始化的(成员变量初始化先于 构造器的初始化 并且没有手动赋值的变量java 默认进行初始化赋值  注意:这里说的都是类成员变量  对于局部变量或方法体内的变量不成立的),所以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 修饰的方法和类成员变量在类加载时就进行了初始化;另外对于类成员变量、静态类成员变量、构造函数 在类第一次被调用的时候初始化顺序为:静态类成员变量》类成员变量》构造函数    注意:静态类成员只在首次引用对于类的时候才加载而且只加载一次

你可能感兴趣的:(java基础,java,对象)