类的初始化过程有类的初始化和对象的初始化,类的初始化在先。
class StaticClass{
static int b=0;
int a;
static{
System.out.println("块里初始化类变量static b");
b=4;
}
{System.out.println("块里初始化实例变量a");
a=4;}
StaticClass(){
System.out.println("子类中的static变量是否在定义时就被赋值:"+Sub.sub);
System.out.println("b="+b);
System.out.println("a="+a);
}
StaticClass(boolean b){
System.out.println("子类构造器中的实例变量在它调用父类的构造器后才赋值吗
?"+b);
}
}
class Sub extends StaticClass{
static boolean sub=true; //定义一个类变量,实验要验证在创建Sub对象前,这个变量是否就已经被初始化。
boolean objectV=true;
Sub(){
//super(objectV); //①
}
}
public class StaticTest{
public static void main(String args[]){
new StaticClass(); //创建两个StaticTest对象
new StaticClass();
new Sub();
}
}
运行结果:
块里初始化类变量static b
块里初始化实例变量a
子类中的static变量是否在定义时就被赋值:true
b=4
a=4
块里初始化实例变量a
子类中的static变量是否在定义时就被赋值:true
b=4
a=4
块里初始化实例变量a
子类中的static变量是否在定义时就被赋值:true
b=4
a=4
【运行结果显示】
1、 “块里初始化类变量static b”只输出一句,说明在程序运行中,不管创建多少个类对象,类变量只初始化一次。
2、“块里初始化实例变量a”输出三句,说明在程序运行中,对象创建多少个,其实例变量就初始化多少次。
3、“子类中的static变量是否在定义时就被赋值:true”答案是true,说明类变量在没有创建任何对象时就已经初始化了。
如果把语句①复原,再运行,运行结果如下:
D:\笔记\program>javac StaticTest.java
StaticTest.java:25: 无法在调用父类型构造函数之前引用 objectV
super(objectV);
^
1 错误
【结论】
直接说明了,实例变量无法在父类构造函数之前被引用,而进一步地说明了类变量在对象初始化前可以被引用,它在这之前就已经被初始化.