zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    用户IP地址的三个属性的区别(HTTP_X_FORWARDED_FOR,HTTP_VIA,REM_addr
    Backbone源码分析-Backbone架构+流程图
    为什么我的SQL server 在附加数据库后,数据库总是变成了只读?
    js window.open()实现打印,如何在关闭打印窗口时刷新父窗口
    .NET获取不到js写的cookie解决方法
    网站安全狗”响应内容保护“网页错误返回页面优化功能介绍
    快钱支付与Sql Server的乐观锁和悲观锁
    RequiredFieldValidator 根据group组来触发验证
    DropDownList中显示无限级树形结构
    大量多风格多功能后台管理模板
  • 原文地址:https://www.cnblogs.com/fqfanqi/p/11830941.html
Copyright © 2011-2022 走看看