Think in Java之构造器的真正调用顺序

发表于:2012-3-01 09:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:yaerfeng    来源:51Testing软件测试网采编

  构造器是OOP的重要组成部分,很多人认为它很容易。只不过是new了一个对象而已。而think in java的作者却告诉我们,其实这并不容易。

  先看下面这个例子。在你没看结果之前,你觉得你的答案是对的么。

  1. package com.tudou.t1;  
  2. class Meal {  
  3.     Meal() {  
  4.         System.out.println("meal");  
  5.     }  
  6. }  
  7. class Bread {  
  8.     Bread() {  
  9.         System.out.println("Bread");  
  10.     }  
  11. }  
  12. class Cheese {  
  13.     Cheese() {  
  14.         System.out.println("Cheese");  
  15.     }  
  16. }  
  17. class Lettuce {  
  18.     Lettuce() {  
  19.         System.out.println("Lettuce");  
  20.     }  
  21. }  
  22. class Lunch extends Meal{  
  23.     Lunch() {  
  24.         System.out.println("Lunch");  
  25.     }  
  26. }  
  27. class PortableLunch extends Lunch{  
  28.     PortableLunch() {  
  29.         System.out.println("PortableLunch");  
  30.     }  
  31. }  
  32. public class Sandwich extends PortableLunch {  
  33.     private Bread b = new Bread();  
  34.     private Cheese c = new Cheese();  
  35.     private Lettuce l = new Lettuce();  
  36.     public Sandwich() {  
  37.         System.out.println("Sandwich");  
  38.     }  
  39.     public static void main(String[] args) {  
  40.         new Sandwich();  
  41.     }  
  42. }

  控制台的打印结果为:

meal
Lunch
PortableLunch
Bread
Cheese
Lettuce
Sandwich

  复杂对象调用构造器的顺序应该遵循下面的原则:

  1、调用基类[即父类]构造器。这个步骤会不断反复递归下去,首先是构造器这种层次结构的根,然后是下一层导出类[即子类],等等。直到最底层的导出类。[从最上层的meal一直递归到PortableLunch]

  2、按声明顺序调用成员的初始化方法。[即上面的Bread,Cheese,Lettuce]

  3、调用导出类构造器的主体[即Sandwich]

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号