zoukankan      html  css  js  c++  java
  • (转)面试题--JAVA中静态块、静态变量加载顺序详解

     1 public class Test {                         //1.第一步,准备加载类
     2 
     3     public static void main(String[] args) {
     4         new Test();                         //4.第四步,new一个类,但在new之前要处理匿名代码块        
     5     }
     6 
     7     static int num = 4;                    //2.第二步,静态变量和静态代码块的加载顺序由编写先后决定 
     8 
     9     {
    10         num += 3;
    11         System.out.println("b");           //5.第五步,按照顺序加载匿名代码块,代码块中有打印
    12     }
    13 
    14     int a = 5;                             //6.第六步,按照顺序加载变量
    15 
    16     { // 成员变量第三个
    17         System.out.println("c");           //7.第七步,按照顺序打印c
    18     }
    19 
    20     Test() { // 类的构造函数,第四个加载
    21         System.out.println("d");           //8.第八步,最后加载构造函数,完成对象的建立
    22     }
    23 
    24     static {                              // 3.第三步,静态块,然后执行静态代码块,因为有输出,故打印a
    25         System.out.println("a");
    26     }
    27 
    28     static void run()                    // 静态方法,调用的时候才加载// 注意看,e没有加载
    29     {
    30         System.out.println("e");
    31     }
    32 }

    输出:abcd

    一般顺序:静态块(静态变量)——>成员变量——>代码块——>构造方法——>静态方法 
    1、静态代码块(只加载一次) 2、构造方法(创建一个实例就加载一次)3、静态方法需要调用才会执行,所以最后结果没有e 
    这里写图片描述

    这里写图片描述

    1 public class Print {
    2 
    3      public Print(String s){
    4          System.out.print(s + " ");
    5      }
    6  }
     1 public class Parent{
     2 
     3      public static Print obj1 = new Print("1");
     4 
     5      public Print obj2 = new Print("2");
     6 
     7      public static Print obj3 = new Print("3");
     8 
     9      static{
    10          new Print("4");
    11      }
    12 
    13      public static Print obj4 = new Print("5");
    14 
    15      public Print obj5 = new Print("6");
    16 
    17      public Parent(){
    18          new Print("7");
    19      }
    20 
    21  }
     1 public class Child extends Parent{
     2 
     3      static{
     4          new Print("a");
     5      }
     6 
     7      public static Print obj1 = new Print("b");
     8 
     9      public Print obj2 = new Print("c");
    10 
    11      public Child (){
    12          new Print("d");
    13      }
    14 
    15      public static Print obj3 = new Print("e");
    16 
    17      public Print obj4 = new Print("f");
    18 
    19      public static void main(String [] args){
    20          Parent obj1 = new Child ();
    21          Parent obj2 = new Child ();
    22      }
    23  }
    执行main方法,程序输出顺序为: 1 3 4 5 a b e 2 6 7 c f d 2 6 7 c f d 

    输出结果表明,程序的执行顺序为: 
    如果类还没有被加载: 
    1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。 
    2、执行子类的静态代码块和静态变量初始化。 
    3、执行父类的实例变量初始化 
    4、执行父类的构造函数 
    5、执行子类的实例变量初始化 
    6、执行子类的构造函数 

    如果类已经被加载: 
    则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。

  • 相关阅读:
    Linux makefile教程之概述一[转]
    Valid Parentheses
    Letter Combinations of a Phone Number
    机器学习经典分类算法 —— C4.5算法(附python实现代码)
    3Sum Closest
    3Sum
    Integer to Roman
    寒假文献阅读(四)
    Longest Common Prefix
    Roman to Integer
  • 原文地址:https://www.cnblogs.com/kingxiaozi/p/6021011.html
Copyright © 2011-2022 走看看