java------继承与初始化----一个程序的调试及分析

来源:互联网 发布:异世之淘宝女王txt下载 编辑:程序博客网 时间:2024/05/08 11:10
package com.zhou1;class System1{public static int print(String s){System.out.println(s);return 2;}}class Insect{   private int i = 9;   protected int j;   public Insect()    {       System.out.println("i="+i);       System.out.println("j="+j);       j = 39;    }      private static int x1 = System1.print("Static x1");}public class Beetle extends Insect{   private int k = System1.print("class Beetle");   public Beetle()   {   System.out.println("k="+k);   System.out.println("j="+j);   }      private static int x2 = System1.print("Static x2");   public static void main(String []args)   {   System.out.println("Constructor");   Beetle beetle = new Beetle();   }}


进入调试




可以看到,在进入main方法之前,类中的static属性已经完成了初始化。

事实上,当在命令行输入java Beetle时,java虚拟机试图访问Beetle.main(),于是对Beetle.class进行加载的过程中,编译器注意到它是一个基类,于是它继续进行加载。再检查基类是否还有基类,有则继续加载。如此类推。接下来,基类的static初始化,然后是它的导出类的static进行初始化。如此类推。这种方法很重要,因为导出类的static初始化很可能会依赖于基类成员是否被正确初始化。

     然后执行System.out.println("Constructor");输出

当程序准备执行Beetle beetle = new Beetle();时,程序跳到


此时发现


说明在对象创造之前,对类的属性的默认初始化就已经执行了

再按f6(步过)



当准备执行Beetle的构造方法时,第一步默认执行super(),先执行对Beetle的基类的属性的赋值操作:int i = 9;然后执行其基类的构造方法,输出i、j的值,然后跳回Beetle,对自己的属性进行赋值操作,所以即将执行int k = System1.print("class Beetle");

下一步:执行Beetle的构造方法







0 0
原创粉丝点击