您的位置:首页 > 编程语言 > Java开发

java 对象的初始化顺序

2017-11-29 12:24 363 查看
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 修饰的方法和类成员变量在类加载时就进行了初始化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: