zoukankan      html  css  js  c++  java
  • java类的加载以及初始化顺序

     1 class Insect {
     2   private int i = 9;
     3   protected int j;
     4   Insect() {
     5     System.out.println("i = " + i + ", j = " + j);
     6     j = 39;
     7   }
     8   private int p=print(" Insect.p initialized");
     9   private static int x1 =print("static Insect.x1 initialized");
    10   static int print(String s) {
    11     System.out.println(s);
    12     return 47;
    13   }
    14 }
    15 
    16 
    17 public class Beetle extends Insect {
    18   private int k = print("Beetle.k initialized");
    19   public Beetle() {
    20     System.out.println("k = " + k);
    21     System.out.println("j = " + j);
    22   }
    23   private static void dd()
    24   {
    25  System.out.println("dd ");
    26   }
    27   private static  int x2 =
    28     print("static Beetle.x2 initialized");
    29   public static void main(String[] args) {
    30     System.out.println("Beetle constructor");
    31     Beetle b = new Beetle();
    32     
    33   }
    34 } 

    本程序的运行结果如下:

    static Insect.x1 initialized

    static Beetle.x2 initialized

    Beetle constructor  

    Insect.p initialized

    i = 9, j = 0

    Beetle.k initialized

    k = 47 j = 39

    首先当我们运行此程序的时候,主线程启动,编译器开始查找Beetle.class这个类,找到这个类后,开始加载这个类,在加载的过程发现有extends关键字,所以编译器开始去加载insect.class这个类,(如果在加载这个类的时候如果发现这个类还有基类,那么insect的直接基类就会被加载,如果还有基类,以此类推)此时因为insect没有基类了,所以不需要再加载,此时(加载insect类时)insect类的静态代码将执行(静态成员的初始化),所以此时打印出了  static Insect.x1 initialized, 当insect的静态代码执行完后, Beetle的静态代码开始执行 (初始化x2), 所以打印出:static Beetle.x2 initialized;

    到现在为止,所有基类以及静态的初始化动作都已经执行完了,可以创建对象了。

    这时候执行System.out.println("Beetle constructor");所以打印出:Beetle constructor;

    下面开始执行Beetle b = new Beetle();此时首先为Beetle分配内存空间,并且都初始化为0,注意boolean类型变量初始化为false;

    在Beetle内的代码执行前,首先会调用基类的构造器,在基类(insect)的构造器内的代码执行前,首先要执行基类的非静态成员的初始化,此时p被初始化为47,并且打印出:Insect.p initialized;当执行初始化后,基类的构造器里的代码System.out.println("i = " + i + ", j = " + j)开始执行,所以打印出:i = 9, j = 0;此时j被初始化为39;

    当基类的构造器的代码执行完后,首先要对Beetle类的非静态成员进行显示的初始化,此时K被初始化为47,并且打印出:Beetle.k initialized;等初始化完成后,Beetle构造器里的代码开始执行,所以打印出:K=47;J=39,o(∩_∩)o...哈哈程序的结构分析完了。 值得注意的是:静态成员初始化是从最顶层的类开始的,因为子类成员的初始化可能回用到基类的成员。

    所以类加载以及初始化的顺序是:类的静态成员初始化分配内存(有父类的先父类,然后自己)->然后main方法执行->类初始化{类非静态成员的初始化,然后执行构造器(有父类的先给父类的非静态成员初始化,然后父类的构造器)}

  • 相关阅读:
    java小知识点8
    MongoDB执行计划分析详解(1)
    面对Schema free 的MongoDB,如何规范你的schema
    Mongodb简介
    编程之法:面试和算法心得(最大连续乘积子串)
    编程之法:面试和算法心得(荷兰国旗)
    编程之法:面试和算法心得(奇偶调序)
    编程之法:面试和算法心得(最大连续子数组和)
    编程之法:面试和算法心得(寻找和为定值的多个数)
    744. Find Smallest Letter Greater Than Target
  • 原文地址:https://www.cnblogs.com/sara-gcj/p/3318379.html
Copyright © 2011-2022 走看看