无论创建多少个对象,静态数据只占用一份存储区域,也就是说static关键字不能应用于局部变量,且只初期化一次。
package java_5;
import java.Print;
public class Bowl {
Print p = new Print();
Bowl(int i){
p.printl("Bowl(" + i + ")");
}
void f1(int i){
p.printl("f1(" + i + ")");
}
}
package java_5;
import java.Print;
public class Table {
Print p = new Print();
static Bowl bowl1 = new Bowl(1);
Table(){
p.printl("Table()");
bowl2.f1(1);
}
void f2(int i){
p.printl("f2(" + i + ")");
}
static Bowl bowl2 = new Bowl(2);
}
package java_5;
import java.Print;
public class Cupboard {
Print p = new Print();
Bowl bowl3= new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard(){
p.printl("Cupboard()");
}
void f3(int i){
p.printl("f3(" + i + ")");
}
static Bowl bowl5 = new Bowl(4);
}
package java_5;
import util.Print;
public class StaticInitialization {
static Print p = new Print();
public static void main(String[] args){
p.printl("Creat new Cupboard() in main");
new Cupboard();
p.printl("Creat new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
/**
* 控制台输出结果
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(4)
Bowl(3)
Cupboard()
Creat new Cupboard() in main
Bowl(3)
Cupboard()
Creat new Cupboard() in main
Bowl(3)
Cupboard()
f2(1)
f3(1)
*/
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
静态变量只初期化一次所以bowl(3)会一直被初始化,而bowl1,2,4,5不会.
初始化的顺序:静态对象,非静态对象。
创建对象过程:
假设有Dog的类。
1.及时没有显示的使用static关键字,高早起实际上也是静态方法。首次创建dog对象,或者Dog类的静态方法/静态域首次被访问时,java解释器必须查找类路径,一定为dog.class文件。
2.然后载入Dog.class,有关静态初始化所有动作都会执行。因此静态初始化只在class对象首次加载的时候进行一次。
3.new Dog()创建对象的时候,首先将在堆上分配足够的存储空间。
4.这块儿存储空间会被清零,这就是自动将Dog对象中所有基本类型数据都设置成了默认值,而引用则被设置成null。
5.之行所有出现雨字段定义处的初始化动作。
6.执行构造器。