无论创建多少个对象,静态数据只占一份存储区域(方法区里)。static关键字不能用于局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本的数据类型的标准;如果它是一个引用,那么会获得初始值null。
package com.test;
public class Test {
public static void main(String[] args){
System.out.println("进入main函数");
new Cupboard();
}
static Table table = new Table();
public Bowl bowl = new Bowl(10);
}
class Bowl{
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
}
class Table extends Cupboard{
Bowl bowl1 = new Bowl(1);
static Bowl bowl2 = new Bowl(2);
static{
Bowl bowl3 = new Bowl(3);
}
{
Bowl bowl4 = new Bowl(4);
}
Table() {
System.out.println("Table()");
}
Bowl bowl5 = new Bowl(5);
static Bowl bowl6 = new Bowl(6);
}
class Cupboard{
Bowl bowl1 = new Bowl(7);
Cupboard() {
System.out.println("Cupboard()");
}
}
输出:
总结一下对象的创建过程,假设有个名为Dog的类:
1、即使没有显示地使用static关键字,构造器实际也是静态方法。因此,当首次创建类型为Dog的对象时(构造器可看成是静态方法),或者Dog的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。
2、然后加载Dog.class,有关静态初始化的所有动作全部被执行。因此,静态初始化只在Class对象首次加载时执行一次。
3、当用new Dog()创建对象的时候,首次将在堆上对Dog对象分配内存空间。
4、这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值,引用类型则为null。
5、执行所有出现于字段定义处的初始化动作。
6、执行构造器,访问父类
参考自《Java编程思想》