Java 类初始化过程

     1  class X {
     2     Y b = new Y();
     3     X() {
     4           System.out.print("X");
     5     }
     6  }
     7   
     8  class Y {
     9     Y() {
    10           System.out.print("Y");
    11     }
    12  }
    13   
    14  public class Z extends X {
    15     Y y = new Y();
    16     Z() {
    17           System.out.print("Z");
    18     }
    19   
    20     public static void main(String[] args) {
    21           new Z();
    22     }
    23  }

类在调用构造函数之前,首先要执行初始化类成员的语句,如果继承了其它的类,则先调用父类的构造函数,之后才执行本类的类成员初始化语句,所以执行顺序为(按照行号标识): 21,16,3,2,9,10(Y),3,4,(X), 16,15,9,10(Y),16,17(Z),之后继续执行到结束.()中为该行输出的字符,所以输出结果为YXYZ。

class HelloA
 {    
     public HelloA() {
        System.out.println("HelloA");
    }
    { System.out.println("I'm A class"); }    
    static { System.out.println("static A"); }

}
public class HelloB extends HelloA 
{    
    public HelloB() {
        System.out.println("HelloB");
    }
    
    { System.out.println("I'm B class"); }    
    static { System.out.println("static B"); }    
    public static void main(String[] args) { 
     new HelloB(); 
   }

}

只以HelloA类为例说明初始化过程:1. static 修饰的静态语句,2.普通类成员的初始化语句,3.构造函数。由于HelloB继承了HelloA,所以只有把HelloA载入内存之后,才会把HelloB载入内存。类中的static块在类被载入内存时立即执行,所以先输出static B,再输出static A。静态块执行完成后,跳转到类的构造函数处,但并不执行其中的构造语句,如果有父类又会跳到父类的构造函数处,但也不立即执行其中的语句。在执行完父类类成员的初始化语句后,才回到父类的构造函数处继续执行,父类构造函数完成后回到子类构造函数,执行子类类成员的初始化,子类属性完成后才回到子类的构造函数处继续执行。

附: jdb命令是jdk附带的一个类似linux gdb的一个调试命令,可以在命令行跟踪程序的运行,详情需参阅文档。



转载于:https://my.oschina.net/sskxyz/blog/488355

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值