Java 中的继承(is-a)与组合(has-a)关系
javajava programming java 8
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 关系,我们可以说 −
- Mammal IS-A Animal
- Reptile IS-A Animal
- Dog IS-A Mammal
- 因此:Dog IS-A Animal
使用 extends 关键字,子类将能够继承超类的所有属性,但超类的私有属性除外。
我们可以通过使用实例运算符确保 Mammal 实际上是一种动物。
示例
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 关系
这些关系主要基于使用情况。这决定了某个类是否具有某些东西。这种关系有助于减少代码重复和错误。
让我们看一个例子 −
示例
public class Vehicle{ } public class Speed{ } public class Van extends Vehicle { private Speed sp; }
这表明 Van 类具有 Speed。通过为 Speed 设置一个单独的类,我们不必将属于 speed 的整个代码放在 Van 类中,这使得在多个应用程序中重用 Speed 类成为可能。
在面向对象特性中,用户无需担心哪个对象在执行实际工作。为了实现这一点,Van 类向 Van 类的用户隐藏了实现细节。因此,基本上发生的事情是,用户会要求 Van 类执行某个操作,而 Van 类会自行完成该工作或要求另一个类执行该操作。