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 修饰的方法和类成员变量在类加载时就进行了初始化;另外对于类成员变量、静态类成员变量、构造函数 在类第一次被调用的时候初始化顺序为:静态类成员变量》类成员变量》构造函数 注意:静态类成员只在首次引用对于类的时候才加载而且只加载一次