java 初始化顺序相关总结

1、成员(包括类成员)自动初始化(赋默认值)必定在构造器之前。

2、对于局部变量,必须在起所在方法中进行初始化。这很好理解:因为自动初始化机制不作用于局部变量,所以若不对局部变量赋初值便会引起混乱。

3、下面看一段代码,了解一下static数据的初始化顺序

 初始化时按照(static数据--->普通成员----->构造函数)的顺序,整个程序的执行过程有点像DFS一样。读者对照着输出结果,按我标的数字走一遍程序,就应该能知道加载的过程了。

class Bowl {
  Bowl(int marker) {
    print("Bowl(" + marker + ")");//3、Bowl(1)   5、Bowl(2)  11、Bowl(4) 13、Bowl(5) 20、Bowl(3)
  }
  void f1(int marker) {
    print("f1(" + marker + ")");//8、f1(1)  16、f1(2)  23、f1(2)
  }
}

class Table {
  static Bowl bowl1 = new Bowl(1);//2
  Table() {
    print("Table()");//6Table()
    bowl2.f1(1);//7
  }
  void f2(int marker) {
    print("f2(" + marker + ")");
  }
  static Bowl bowl2 = new Bowl(2);//4
}

class Cupboard {
  Bowl bowl3 = new Bowl(3);//19
  static Bowl bowl4 = new Bowl(4);//10
  Cupboard() {
    print("Cupboard()");//14、Cupboard() 21、Cupboard()
    bowl4.f1(2);//15  22
  }
  void f3(int marker) {
    print("f3(" + marker + ")");
  }
  static Bowl bowl5 = new Bowl(5);//12
}

public class StaticInitialization {
  public static void main(String[] args) {
    print("Creating new Cupboard() in main");//17
    new Cupboard();//18
    print("Creating new Cupboard() in main");
    new Cupboard();
    table.f2(1);
    cupboard.f3(1);
  }
  static Table table = new Table();//1
  static Cupboard cupboard = new Cupboard();//9
} /* Output:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*/

4、补充一个静态块的初始化。

静态块就是如:

static
{
}
定义于方法或类当中,主要作用是为了给静态成员初始化。这段代码只执行一次:①当首次创建类的一个对象时。或②首次访问属于那个类的静态数据成员时。( 从静态块的作用就可以理解:①创建对象时必须初始化静态成员②访问静态成员是必须初始化

注:初始化时,非静态块的执行在构造函数之前。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值