Java类的加载顺序

1、虚拟机首次加载类时,会对静态初始块,静态对象,静态方法进行一次初始化。

2、只有调用new方法时才会创建实例。

3、类实例创建过程:首先执行父类初始化块部分,然后是父类的构造方法。然后是子类的初始化快和构造方法。

4、类实例销毁时,先销毁子类部分,在销毁父类部分。

 

public class Test {
    public enum TT{
        a(2),
        b(3);
        private TT(int c){
            System.out.println(c);
        }
        private int s;
        public static final String ss="b";
    }
    static{
        System.out.println(1);
        System.out.println(TT.a);;
        System.out.println(4);
    }
    public static void main(String[] args) {
        new Test();
    }
}

打印内容:

1
2
3
a
4

 

实例化对象的过程:

1.检查类是否加载,如果没有加载就加载这个类,要加载所有父类;

懒式加载(按需加载):如果第一次用到加载,只加载一下.通过ClassPath制定的路径寻找类文件(.class)  加载以后是一个对象,类型是class.获得这个类对象:student.class-->class实例

2.在内存堆中分配对象空间.递归分配所有父类和子类属性空间.先父类型再子类型,属性默认自动初始化.自动初始化为"0"值;

3.进行属性的赋值;

4.递归调用父类构造器.(默认调用父类无参构造器);

5.调用本类构造器

 Java编程思想上是这么描述的:

1、当某个型别为Dog(这里用Dog表示一个类)的对象首次被产生出来,或是当class Dog的static函数或static数据成员首次被访问,java直译器必须查找环境变量classpath所指定的位置,找出Dog.class。

2、一旦Dog.class 被装载,他的所有static动作就会被执行起来。因此他的static初始化动作只会发生一次,就是在class对象首次被装载时。

3、当你new Dog()时,构造过程会先为Dog对象在heap上分配足够的存储空间。

4、这块存储空间会被清为0,并自动将Dog对象内所有隶属基本型别的数据设为缺省值(对数字来说是0),并将references设为null。

5、执行所有出现于数据定义处的初始化动作。

6、执行构造函数。

public class TestInstanceInit {
  public static int n = 0;// 静态变量
  static {// 这是静态初始化块
    print();
    System.out.println("this is static block");
  }

  {// 实例初始化块
  System.out.println(n);
  }

public TestInstanceInit() {// 构造方法
  System.out.println("this is TestInstanceInit's constructor~");
}
public static void print() {// 静态方法   System.out.println("this is static method~");   System.out.println(n);   n += 1; } public static void main(String[] args) { new TestInstanceInit(); }
}

控制台输出结果:

this is static method~
0
this is static block
1
this is TestInstanceInit's constructor~

 

如果有一个变量怎么处理呢:

public class TestInstanceInit {
    // 静态变量  
    public static String staticField = "静态变量";  
    // 变量  
    public String field = "变量";  
  
    // 静态初始化块  
    static {  
        System.out.println(staticField);  
        System.out.println("静态初始化块");  
    }  
  
    // 初始化块  
    {  
        System.out.println(field);  
        System.out.println("初始化块");  
    }  
  
    // 构造器  
    public TestInstanceInit() {  
        System.out.println("构造器");  
    }  
  
    public static void main(String[] args) {  
        new TestInstanceInit();  
    } 
}

控制台输出结果: 静态变量
静态初始化块
变量
初始化块
构造器

原文地址:https://www.cnblogs.com/javammc/p/7309281.html