Java类的初始化顺序

Java类的初始化顺序


初始化顺序

在类的内部,变量定义的先后顺序决定了初始化的顺序。
变量定义散布于方法定义之前,它们会在任何方法(包括构造器) 被调用之前得到初始化。
初始化的顺序是先静态对象(如果它们尚未被初始化),而后是非静态对象。

  1. 构造器也是一种静态方法,因此当首次创建类的对象(或者类的静态方法/静态域 首次被访问时)Java解释器必须查找类路径,以定位.class文件。
  2. 然后载入.class(实际上创建了一个Class对象),有关静态初始化的所有动作都会被执行,因此静态初始化只在Class对象首次加载的时候执行一次。
  3. 当用new + 构造函 进行创建对象时,首先会在堆上为这个对象分配足够的存储空间。
  4. 这块存储空间会被清零,这就自动地将 对象 中所有的基本类型数据都设置成了默认值(对于数字来说就是 0 ,堆布尔型和字符型也相同),而引用则被设置成了null。
  5. 执行所有出现于字段定义处的初始化动作(即初始化各种变量)。
  6. 最后执行构造器。

代码块


class Bowl{
    public Bowl(int i) {
        // TODO Auto-generated constructor stub
        System.out.println("Bowl: " + i );

    }
    void f1(int i) {
        System.out.println("f1: "+ i);
    }
}

class Table{
    static Bowl bowl1 = new Bowl(1);
    Table(){
        System.out.println("Table()");
        bowl2.f1(1);
    }
    void f2(int i) {
        System.out.println("f2: "+ i);
    }
    static Bowl bowl2 = new Bowl(2);
}

class Cupboard {
    Bowl bowl3 = new Bowl(3);
    static Bowl bowl4 = new Bowl(4);
    Cupboard(){
        System.out.println("Cupboard");
        bowl4.f1(2);
    }
    void f3(int i) {
        System.out.println("f3: "+ i);
    }
    static Bowl bowl5 = new Bowl(5);
}

public class helloworld {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Creat cupboard in main");
        new Cupboard();
        System.out.println("Creat cupboard in main");
        new Cupboard();
        table.f2(1);
        cupboard.f3(1);
    }
    static Table table = new Table();
    static Cupboard cupboard = new Cupboard();
}

Output

Bowl: 1
Bowl: 2
Table()
f1: 1
Bowl: 4
Bowl: 5
Bowl: 3
Cupboard
f1: 2
Creat cupboard in main
Bowl: 3
Cupboard
f1: 2
Creat cupboard in main
Bowl: 3
Cupboard
f1: 2
f2: 1
f3: 1

初始化时,类中域为基本类型时能够自动被初始化为零,但是对象引用会被初始化为null,如果试图为它们调用任何方法都会得到一个异常——运行时错误。
如果想初始化这些引用,可以在代码中的下列位置进行:
1. 在定义对象的地方。这就意味着它们总是能在构造器被调用之前初始化。
2. 类的构造器中。
3. 就在正要使用这些对象之前,这种方式被称为“惰性初始化”,在不必要每次都生成对象的情况下,这种方式可以减少额外负担。
4. 使用实例初始化。

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值