需求:创建一个Animal父类,分别创建Bird子类和Dog子类分别继承Animal父类,并且复用Animal的方法和定义自己独有的方法。
第一种:使用继承实现,代码如下:- class Animal
- {
- private void beat()
- {
- System.out.println("心脏跳动...");
- }
- public void breath()
- {
- beat();
- System.out.println("呼吸中...");
- }
- }
- //继承Animal类,直接复用Animal的breath()方法
- class Bird extends Animal
- {
- public void fly()
- {
- System.out.println("我在飞翔....");
- }
- }
- //继承Animal类,直接复用Animal的breath()方法
- class Dog extends Animal
- {
- public void run()
- {
- System.out.println("我在地上跑....");
- }
- }
- class TestInherit
- {
- public static void main(String[] args)
- {
- Bird b = new Bird();
- b.breath();
- b.fly();
- Dog d = new Dog();
- d.breath();
- d.run();
- }
- }
复制代码 第二种,使用组合关系实现,代码如下:- class Animal
- {
- private void beat()
- {
- System.out.println("心脏跳动...");
- }
- public void breath()
- {
- beat();
- System.out.println("呼吸中...");
- }
- }
- class Bird
- {
- //将原来的父类嵌入原来的子类,作为子类的一个组合成分
- private Animal a;
- public Bird(Animal a)
- {
- this.a = a;
- }
- //重新定义一个自己的breath()方法
- public void breath()
- {
- //直接复用Animal提供的breath()方法来实现Bird的breath()方法
- a.breath();
- }
- public void fly()
- {
- System.out.println("我在飞...");
- }
- }
- class Dog
- {
- //将原来的父类嵌入原来的子类,作为子类的一个组合成分
- private Animal a;
- public Dog(Animal a)
- {
- this.a = a;
- }
- //重新定义一个自己的breath()方法
- public void breath()
- {
- //直接复用Animal提供的breath()方法来实现Bird的breath()方法
- a.breath();
- }
- public void run()
- {
- System.out.println("我在地上跑...");
- }
- }
- class TestComposite
- {
- public static void main(String[] args)
- {
- //显示创建被嵌入对象
- Animal a1 = new Animal();
- Bird b = new Bird(a1);
- b.breath();
- b.fly();
- //显示创建被嵌入对象
- Animal a2 = new Animal();
- Dog d = new Dog(a2);
- d.breath();
- d.run();
- }
- }
复制代码 说明:两道程序运行结果相同。
问题:使用组合来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统的开销会更大?
组合关系的实现原理是什么?我们在开发时,确定使用继承还是使用组合,需要考虑哪些方面?
|