• 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();  
        } 
    }

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

  • 相关阅读:
    windows平台下一款强大的免费代理获取工具
    彻底搞懂Git Rebase
    line-height
    text-indent
    text-decoration
    text-align
    color
    CSS属性汇总
    font
    font-style
  • 原文地址:https://www.cnblogs.com/javammc/p/7309281.html
Copyright © 2020-2023  润新知