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 类会自行完成该工作或要求另一个类执行该操作。


相关文章