Life

Monday, October 15, 2018

static{}静态代码块

在最近的笔试过程中遇到一个关于静态代码块的题,代码大概是下面这样的:



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。
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者Leslie Tien和本文原始地址:
https://leslietien.blogspot.com/2018/10/static.html

No comments:

Post a Comment