• Java面试--类加载顺序


    类什么时候就行初始化:

      1)创建类的实例,也就是new一个对象 
      2)访问某个类或接口的静态变量,或者对该静态变量赋值 
      3)调用类的静态方法 
      4)反射(Class.forName(“com.fanqi.load.Child”)) 
      5)初始化一个类的子类(会首先初始化子类的父类) 
      6)JVM启动时标明的启动类,即文件名和类名相同的那个类 

    类的初始化顺序:

      1)如果这个类还没有被加载和链接,那先进行加载和链接 
      2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口) 
      3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。 

      4)总的来说,初始化顺序依次是:父类的静态变量、静态初始化块 -->  子类的静态变量、静态初始化块 -->  父类的非静态初始化块 --> 父类构造方法 --> 子类的非静态初始化块 --> 子类的构造方法

     1 package com.qa.xgold.auto.model;
     2 
     3 public class Parent {
     4 
     5     public static String result = parentStaticMethod2();
     6 
     7     private static String parentStaticMethod2() {
     8         System.out.println("父类的静态方法2");
     9         return "I am parentStaticMethod2 !";
    10     }
    11 
    12     {
    13         System.out.println("父类的非静态初始化块!");
    14     }
    15 
    16     static {
    17         System.out.println("父类的静态初始化块!");
    18     }
    19 
    20     public Parent(){
    21         System.out.println("父类的构造方法!");
    22     }
    23 
    24     public static String parentStaticMethod1(){
    25         System.out.println("父类的静态方法1!");
    26         return "I am parentStaticMethod1 !";
    27     }
    28 
    29 }
     1 package com.qa.xgold.auto.model;
     2 
     3 public class Child extends Parent {
     4 
     5     {
     6         System.out.println("子类非静态初始化块!");
     7     }
     8 
     9     static {
    10         System.out.println("子类静态初始化块!");
    11     }
    12 
    13     public Child(){
    14         System.out.println("子类的构造方法!");
    15     }
    16 
    17     public static String childStaticMethod(){
    18         System.out.println("子类的静态方法!");
    19         return "";
    20     }
    21 
    22     public static void main(String[] args){
    23         new Child();
    24     }
    25 
    26 }
    27 
    28 
    29 // 执行结果
    30 父类的静态方法2
    31 父类的静态初始化块!
    32 子类静态初始化块!
    33 父类的非静态初始化块!
    34 父类的构造方法!
    35 子类非静态初始化块!
    36 子类的构造方法!
    37 
    38 Process finished with exit code 0
  • 相关阅读:
    逻辑结算的结果是什么类型?比较运算的值是什么类型?
    算术运算有哪些?逻辑运算有哪些?比较运算有哪些?
    为什么要强制类型转换?什么情况下使用强制类型转换?说说强制类型转换的优点和缺点
    Java中如何强制类型转换
    基本数据类型和引用类型的区别
    Go switch语句
    Go 循环
    Go if_else语句
    Go 包
    Go 函数
  • 原文地址:https://www.cnblogs.com/fqfanqi/p/11830941.html
Copyright © 2020-2023  润新知