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类会自己执行该操作,或者要求另一个类执行该操作。

更新于:2020年6月17日

691 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告