前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、静态/非静态内部类

public class StaticClass {

  public static long OUTER_DATE = System.currentTimeMillis();

  static {
    System.out.println("外部类静态块加载时间:" + System.currentTimeMillis());
  }

  public StaticClass() {
    System.out.println("外部类构造函数时间:" + System.currentTimeMillis());
  }

  static class InnerStaticClass {
    public static long INNER_STATIC_DATE = System.currentTimeMillis();
    static{
      System.out.println("静态内部类静态块加载时间:" + System.currentTimeMillis());
    }
  }

  class InnerClass {
    public long INNER_DATE = 0;
    public InnerClass() {
      INNER_DATE = System.currentTimeMillis();
    }
  }

1.1、当外部类静态变量被调用

从控制台打印的结果我们可以看到:外部静态变量调用时,外部内进行了加载(注:静态代码块在类被加载时执行)并且执行了初始化操作(注:构造方法被调用),而静态内部类并没有被加载(注:静态内部类中的静态代码块没有执行),且类的加载顺序必定会在初始化的前面,所有看到先执行了静态代码块中的代码,其次执行了构造方法中的代码,完成上面两部后最后才打印出了静态变量

public static void main(String[] args) {
  StaticClass outer = new StaticClass();
  System.out.println("外部类静态变量加载时间:" + outer.OUTER_DATE);
}



外部类静态块加载时间1556088212487
外部类构造函数时间1556088212487
外部类静态变量加载时间1556088212487

1.2、非静态内部类变量调用时:

非静态内部类变量被调用时的执行结果和外部静态变量被调用的结果一样,并且静态内部类也没有被加载,出现这种情况也在预料之中,因为非静态内部类的初始化不许依赖于外部类,如果想实例化一个非静态内部类,则必须先实例化外部类

public static void main(String[] args) {
  StaticClass outer = new StaticClass();
  System.out.println("非静态内部类加载时间"+outer.new InnerClass().INNER_DATE);
}



外部类静态块加载时间1556088682706
外部类构造函数时间1556088682706
非静态内部类加载时间1556088682707

1.3、静态内部类中的变量被调用时

静态内部类的变量被调用时,我们可以看出外部类进行了加载 (注:外部类中的静态代码块中的代码执行了),但是并没有被初始化(因为外部类的构造方法并没有执行),且静态内部类也完成了加载。

public static void main(String[] args) {
  System.out.println("静态内部类加载时间:"+InnerStaticClass.INNER_STATIC_DATE);
}


外部类静态块加载时间1556089480349
静态内部类静态块加载时间1556089480352
静态内部类加载时间1556089480352

ContactAuthor