Java中的继承(is-a)与组合(has-a)关系
IS-A关系
IS-A是一种说法——这个对象是一种那个对象。让我们看看如何使用extends关键字来实现继承。
public class Animal { } public class Mammal extends Animal { } public class Reptile extends Animal { } public class Dog extends Mammal { }
现在,如果我们考虑IS-A关系,我们可以说:
- 哺乳动物 IS-A 动物
- 爬行动物 IS-A 动物
- 狗 IS-A 哺乳动物
- 因此:狗 IS-A 动物
使用extends关键字,子类将能够继承超类的所有属性,除了超类的私有属性。
我们可以用instance运算符来确保哺乳动物实际上是一种动物。
示例
class Animal { } class Mammal extends Animal { } class Reptile extends Animal { } public class Dog extends Mammal { public static void main(String args[]) { Animal a = new Animal(); Mammal m = new Mammal(); Dog d = new Dog(); System.out.println(m instanceof Animal); System.out.println(d instanceof Mammal); System.out.println(d instanceof Animal); } }
这将产生以下结果:
输出
true true true
HAS-A关系
这些关系主要基于用法。这决定了某个类是否HAS-A某个东西。这种关系有助于减少代码重复和错误。
让我们来看一个例子:
示例
public class Vehicle{ } public class Speed{ } public class Van extends Vehicle { private Speed sp; }
这表明Van类HAS-A速度。通过为速度创建一个单独的类,我们不必将属于速度的整个代码放在Van类中,这使得可以在多个应用程序中重用Speed类。
在面向对象特性中,用户不需要关心哪个对象正在执行实际工作。为实现这一点,Van类向Van类的用户隐藏了实现细节。所以,基本上发生的事情是,用户会要求Van类执行某个操作,而Van类会自己执行该操作,或者要求另一个类执行该操作。
广告