关于静态数据的初始化顺序问题

//代码如下,摘自java编程思想:

class Bowl {
    Bowl(int maker) {
    System.out.println("Bowl(" + maker + ")");
    }
    void f1(int maker) {
    System.out.println("f1(" + maker + ")");
    }
}

class Table {
    static Bowl bowl1 = new Bowl(1);
    Table() {
        System.out.println("Table()");
        bowl2.f1(1);
    }
    void f2(int maker) {
        System.out.println("f2(" + maker + ")");
    }
    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 maker) {
        System.out.println("f3(" + maker + ")");
    }
    static Bowl bowl5 = new Bowl(5);
}

public class StaticInitialization {
    public static void main(String[] args) {
        System.out.println("Creating new Cupboard() in main");
        new Cupboard();
        System.out.println("Creating new 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)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)

要了解静态存储区域是何时初始化的。人人都知道一个程序是从main()方法开始的,但是如果直接着手main方法开始进入程序,那么得出的output就不是正确的了。这里涉及到类加载的问题。

首先得知道初始化的顺序:1.先静态对象 2.非静态对象 。

在Table类和Cupboard类里面加入了Bowl类型的静态成员变量,而且只有在第一个Table对象被创建的时候,它们才会被初始化,并且只能被初始化一次。

从output观察:要想执行main方法,必须要加载StaticInitialization类,然后静态域table 、cupboard被初始化,即它们对应的类被加载,并且Table类和Cupboard类里包含静态的Bowl对象,所以Bowl类也被加载,即在main()方法开始之前这几个类都被加载了。所以,输出结果的顺序就明白了吧。

需要注意的地方:

1.先静态对象,后非静态对象;
2.静态对象只能被初始化一次(output里面的Bowl(1)、2、4、5只出现一次,而Bowl(3)出现了两次,因为new了两个Cupboard()对象);

以上总结是个人理解及书上的解释,若有错误请指正、各位大神多多包涵!本人Java小白,愿与大家多交流学习。(第一次用Markdown..)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值