在最近的笔试过程中遇到一个关于静态代码块的题,代码大概是下面这样的:
package test;
/**
*
* Title:A
* Description:static 静态块
* @author LeslieTian
* @date 2018-10-14 下午4:52:11
* @version 1.0
*/
class A{
static{
System.out.println("A.static");
}
public A() {
System.out.println("A");
}
}
class B extends A{
static {
System.out.println("B.static");
}
public B(){
System.out.println("B");
}
}
public class Static {
public static void main(String[] args) {
new B();
new B();
}
}
运行的结果是:
A.static
B.static
A
B
A
B
为什么会出现这样的结果呢?
static{}(即static块),会在类被加载的时候执行且仅会被执行一次,所以在类A与类B加载时执行static块输出
A.static
B.static
但是之后的创建类B的实例化对象时实例化了两个,只输出打印了一个,这是因为在虚拟机的生命周期中一个类只被加载一次;又因为static{}是伴随类加载执行的,所以,不管你new多少次对象实例,static{}都只执行一次。
另外,输出打印 ABAB 是因为子类在构造是会先执行父类的无参构造函数,又因为实例化两次,所以输出两次AB。
No comments:
Post a Comment