public static void main(String
[] args
) {
A ab
= new B();
ab
= new B();
}
}
class A{
static{
System
.out
.print("1");
}
public A(){
System
.out
.print("2");
}
}
class B extends A{
static{
System
.out
.print("a");
}
public B(){
System
.out
.print("b");
}
输出结果是
1a2b2b
先分析这句: A ab = new B(); 子类对象指向父类引用,先执行父类,又有如下的优先级关系, 静态代码块>普通代码块>构造方法 所以先执行父类静态代码快,子类静态代码块,父类构造函数,子类构造函数。 ab = new B(); 又新建对象,重新执行构造方法 父类>子类 static代码块只执行一次原因: static代码块只在类加载时执行,类是用类加载器来读取的,类加载器是带有一个缓存区的, 它会把读取到的类缓存起来,所以在一次虚拟机运行期间,一个类只会被加载一次,这样的话静态代码块只会运行一次。
转载请注明原文地址:https://ipadbbs.8miu.com/read-27523.html