Java静态数据的初始化

2019-04-18 08:54:33来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Java中无论创建多少对象,静态数据都只占一份存储区域。

下面程序示例静态存储区域的初始化:

//: initialization/StaticInitialization.java
// Specifying initial values in a class definition.

class Bowl{
    // 构造器
    Bowl(int marker){
        System.out.println("Bowl("+marker+")");
    }
    // 方法
    void f1(int marker){
        System.out.println("f1("+marker+")");
    }
}

class Table{
    // 静态域
    static Bowl bowl1 = new Bowl(1);
    // 构造器
    Table(){
        System.out.println("Table()");
        bowl2.f1(1);
    }
    // 方法
    void f2(int marker){
        System.out.println("f2("+marker+")");
    }
    // 静态域
    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 marker){
        System.out.println("f3("+marker+")");
    }
    // 构造器
    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();
}
---------- Java ----------
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)

Output completed (0 sec consumed) - Normal Termination

初始化的顺序是:先静态对象,而后是“非静态”对象。

要执行main(),必须加载StaticInitialization类,然后其静态域table和cupboard被初始化,这导致他们对应的类也被加载,并且由于它们都包含静态的Bowl对象,因此Bowl随后也被加载。这样,在这个特殊的程序中的所有的类在main()开始之前就都被加载了。

个人理解: 首先从main()函数开始,加载StaticInitializaition类,然后对StaticInitializaition类中的静态域Table进行初始化,加载Table类,Table类中包含静态的Bowl对象,接着加载Bowl类,加载Bowl类构造器创建bowl1对象,输出Bowl(1),加载Bowl类构造器创建bowl2对象,输出Bowl(2);同里创建cupboard对象。

需要注意的是,bowl3是非静态域,每次创建Cupboard对象都会创建一个Bowl对象。


原文链接:https://www.cnblogs.com/zhanghuaze/p/10715931.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:ztree搜索节点并展开

下一篇:阿里面试题,深入理解Java类加载机制