1. 先静态对象,后非静态对象,后构造函数。
2. 静态成员初始化之后,再次初始化对象,静态成员不会被第二次初始化。
public class Bowl { Bowl(int i){ System.out.println("Bowl"+i); } void Bowlf1(int i){ System.out.println("Bowl.f1--"+i); } }
public class Table { static Bowl bowl1=new Bowl(1); Table(){ System.out.println("Table()"); bowl2.Bowlf1(1); } void Tablef2(int i){ System.out.println("Table.f2--"+i); } static Bowl bowl2=new Bowl(2); }
public class Cupboard { Bowl bowl3=new Bowl(3);//后初始化 static Bowl bowl4=new Bowl(4);//先初始化静态对象 Cupboard(){ System.out.println("Cupboard()"); bowl4.Bowlf1(2); } void Cupboardf3(int i){ System.out.println("Cupboard.f3--"+i); } static Bowl bowl5=new Bowl(5); }
public class StaticInitTest { public static void main(String[] args){ System.out.println("创建 Cupboard in main"); new Cupboard(); System.out.println("======================"); System.out.println("创建 Cupboard2 in main"); new Cupboard(); System.out.println("======================"); table.Tablef2(1); System.out.println("======================"); cupboard.Cupboardf3(1); } static Table table = new Table(); static Cupboard cupboard=new Cupboard(); }
输出:
Bowl1
Bowl2
Table()
Bowl.f1--1
Bowl4
Bowl5
Bowl3
Cupboard()
Bowl.f1--2
创建 Cupboard in main
Bowl3
Cupboard()
Bowl.f1--2
======================
创建 Cupboard2 in main
Bowl3
Cupboard()
Bowl.f1--2
======================
Table.f2--1
======================
Cupboard.f3--1
说明:
以下两句代码在执行Main函数加载类的时候会先被初始化,
static Table table = new Table(); static Cupboard cupboard=new Cupboard();
因为:当类被初始化为对象或者可能会访问到类的静态成员的时候都会引起类的加载。
如果我们不先初始化静态成员的话,我们在下面用到的时候就会引发异常。
如果写 Table table = new Table(); 那么这一句则不会被执行,那么这么写什么时候会执行呢?
那就是StaticInitTest 被初始化的时候,
例如有一个Test类的main函数里写 StaticInitTest t= new StaticInitTest ();
那么Table table = new Table();就会同时被初始化了!
看下面的例子:
public class Insect { private int i = 9; protected int j; public Insect() { System.out.println("i=" + i + ",j=" + j); j = 39; } private static int x1 = printInit("static Insect.x1 initialized"); static int printInit(String s){ System.out.println(s); return 47; } } public class Beetle extends Insect { private int k = printInit("Beetle.k initialized"); public Beetle() { System.out.println("k=" + k); System.out.println("j=" + j); } private static int x2 = printInit("static Beetle.x2 initialized"); static Insect insect=new Insect(); public static void main(String[] args) { System.out.println("Beetle constructor"); Beetle b = new Beetle(); } } 输出: static Insect.x1 initialized static Beetle.x2 initialized i=9,j=0 Beetle constructor i=9,j=0 Beetle.k initialized k=47 j=39