类中属性加载顺序的demo

 1 import lombok.extern.slf4j.Slf4j;
 2 
 3 /**
 4  * 加载顺序
 5  * 静态属性--->静态代码块--->非静态属性--->构造器
 6  * 静态内部类,只有调用getDate 方法时才会加载,且只加载一次。
 7  * 静态属性,只加载一次,在类加载时候加载
 8  */
 9 @Slf4j
10 public class LoadOrderDemos {
11 
12     public static long staticParam =System.currentTimeMillis();
13 
14     public int nonStaticParam=1;
15 
16     static{
17         //date有值,说明date在静态代码块之前加载
18         log.info("---静态代码块执行完之前---staticParam---{}", staticParam);
19         log.info("---静态代码块执行完毕");
20     }
21 
22     public LoadOrderDemos(String name){
23         //nonStaticParam 有值说明非静态属性在构造器之前加载
24         log.info("---{}---构造器执行完之前---nonStaticParam---{}",name,nonStaticParam);
25         log.info("---{}---构造器执行完成",name);
26     }
27 
28     static class InnerClass{
29 
30         public static long date=System.currentTimeMillis();
31 
32     }
33 
34     public long getDate(){
35         return InnerClass.date;
36     }
37     public static void main(String[] args) {
38 
39         //两个对象new 之前 静态代码块和静态属性打印,说明静态加载在前,
40         //调用getDate输出的值相同,说明静态内部类中的静态属性只加载一次,还是延迟加载
41         //打印staticParam,输出的值相同,说明静态属性只加载一次,不是延迟加载。
42         LoadOrderDemos t1=new LoadOrderDemos("t1");
43         LoadOrderDemos t2=new LoadOrderDemos("t2");
44         log.info("---t1---InnerClass.getDate---{}---staticParam---{}",t1.getDate(),staticParam);
45         log.info("---t2---InnerClass.getDate---{}---staticParam---{}",t2.getDate(),staticParam);
46 
47     }
48 }

 

原文地址:https://www.cnblogs.com/geekdc/p/13475474.html