构造器是OOP的重要组成部分,很多人认为它很容易。只不过是new了一个对象而已。而think in java的作者却告诉我们,其实这并不容易。
先看下面这个例子。在你没看结果之前,你觉得你的答案是对的么。
- package com.tudou.t1;
- class Meal {
- Meal() {
- System.out.println("meal");
- }
- }
- class Bread {
- Bread() {
- System.out.println("Bread");
- }
- }
- class Cheese {
- Cheese() {
- System.out.println("Cheese");
- }
- }
- class Lettuce {
- Lettuce() {
- System.out.println("Lettuce");
- }
- }
- class Lunch extends Meal{
- Lunch() {
- System.out.println("Lunch");
- }
- }
- class PortableLunch extends Lunch{
- PortableLunch() {
- System.out.println("PortableLunch");
- }
- }
- public class Sandwich extends PortableLunch {
- private Bread b = new Bread();
- private Cheese c = new Cheese();
- private Lettuce l = new Lettuce();
- public Sandwich() {
- System.out.println("Sandwich");
- }
- public static void main(String[] args) {
- new Sandwich();
- }
- }
|
控制台的打印结果为:
meal Lunch PortableLunch Bread Cheese Lettuce Sandwich |
复杂对象调用构造器的顺序应该遵循下面的原则:
1、调用基类[即父类]构造器。这个步骤会不断反复递归下去,首先是构造器这种层次结构的根,然后是下一层导出类[即子类],等等。直到最底层的导出类。[从最上层的meal一直递归到PortableLunch]
2、按声明顺序调用成员的初始化方法。[即上面的Bread,Cheese,Lettuce]
3、调用导出类构造器的主体[即Sandwich]