全面理解初始化顺序

例子:
  1. class A{
  2.     public String context=test();
  3.     public static int num=getNum();
  4.     {
  5.         System.out.print("A3");
  6.     }
  7.     static{
  8.         System.out.print("A1,");
  9.     }
  10.     public A(){
  11.         System.out.print("A2,");
  12.     }
  13.     public String test()
  14.     {
  15.         String str="A.test(),";
  16.         System.out.print(str);
  17.         return str;
  18.     }
  19.     public static int getNum()//它只属于A
  20.     {
  21.         System.out.print("A.getNum(),");
  22.         return 11;
  23.     }
  24. }
  25. class B extends A{
  26.     {
  27.         System.out.print("c");
  28.     }
  29.     static{
  30.         System.out.print("a,");
  31.     }
  32.     public B(){
  33.         System.out.print("b,");
  34.     }   
  35.     public String test()//覆盖
  36.     {
  37.         String str="B.test(),";
  38.         System.out.print(str);
  39.         return str;
  40.     }
  41.     public static int getNum()//它只属于B,不能覆盖
  42.     {
  43.         System.out.print("B.getNum(),");
  44.         return 21;
  45.     }
  46. }
  47. public class InitTest{
  48.     public static void main(String[] ars){
  49.         new B(); //执行到此处,结果: A.getNum(),A1,a,B.test(),A3A2,cb,
  50.         System.out.println();
  51.         new B(); //执行到此处,结果: B.test(),A3A2,cb,
  52.  }
  53. }



首先在加载类时初始化static变量,同时按定义的顺序执行static{}块;
然后初始化按定义的顺序初始化非static变量;
最后执行构造函数;

以上的每个步骤都是先执行父类部分,再执行子类部分;

附:我的理解
总而言之:先静(变量+块+方法,三者不分先后,按照在代码中出现的顺序初始化);后非(变量+块+函数+构造函数,同样不分先后,按照在代码中出现的顺序初始化)。以上均先执行父类再执行子类。

注意的是,静态XX只初始化一次,所以我们得到了第二次new B()的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值