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