【Thinking in Java真题精选】2. 存在继承关系时的类加载顺序

本题出自《Think in Java》第8章,主要考验在存在继承关系时的类加载顺序,挑战一下吧~

class Bread {
    static { System.out.println("load class: Bread"); }
    Bread() { System.out.println("Bread()"); }
}
class Cheese {
    static { System.out.println("load class: Cheese");}
    Cheese() { System.out.println("Cheese()"); }
}
class Lettuce {
    static { System.out.println("load class: Lettuce"); }
    Lettuce() { System.out.println("Lettuce()"); }
}
class Meal {
    static { System.out.println("load class: Meal"); }
    Meal() { System.out.println("Meal()"); }
}

class Lunch extends Meal {

    static { System.out.println("load class: Lunch"); }
    Lunch() {
        System.out.println("Lunch() 1");
        make();
        System.out.println("Lunch() 2");
    }
    public void make() {
        System.out.println("make lunch");
    }
}

class PortableLunch extends Lunch {
    static { System.out.println("load class: PortableLunch"); }
    PortableLunch() { System.out.println("PortableLunch()"); }
}

public class Sandwich extends PortableLunch {

    private int minutes = 5;
    private Bread b = new Bread();
    private Cheese c = new Cheese();
    private Lettuce l = new Lettuce();

    static { System.out.println("load class: Sandwich"); }

    Sandwich() { 
        System.out.println("Sandwich()");
    }

    public void make() {
        System.out.println("make sandwith with:" + b + "," + c + "," + l);
        System.out.println("need " + minutes + " minutes.");
    }

    public static void main(String[] args) {
        new Sandwich();
    }
}

(答案在最后,先别着急看,做完再对答案才有意思)
如果没有思路的话,可以参考几个要点:
1. 存在继承关系时,类加载顺序为“由父至子”;
2. 当进行实例化时,子类的实例化动作会导致其父类的先完成实例化动作;
3. 按照声明顺序调用成员的初始化方法。

具体到这个例子:
1. 当调用Sandwichmain方法时,看到其由父类,而且父类还有父类,因此会寻根溯源找到最祖宗辈儿Meal,依次由父类到子类完成类加载;
2. Sandwichmain方法中要实例化一个Sandwich对象,也是本着“长辈优先”的原则,依次进行实例化,想想很对嘛,没有老子哪来的儿子;
3. Lunch的构造方法中调用make方法,由于多态的原因,会调用Sandwichmake方法,而此时Sandwich的成员变量尚未完成初始化,所以都是默认值(0或null);
4. 实例化时,该类的成员变量按照代码顺序依次初始化。

又到了对答案的时间:

load class: Meal
load class: Lunch
load class: PortableLunch
load class: Sandwich
Meal()
Lunch() 1
make sandwith with:null,null,null
need 0 minutes.
Lunch() 2
PortableLunch()
load class: Bread
Bread()
load class: Cheese
Cheese()
load class: Lettuce
Lettuce()
Sandwich()

你做对了吗?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值