"IS -A" 关系和 Java 中的 "HAS-A" 关系有什么区别?

What is the difference between "IS -A" relationship and "HAS-A" relationship in Java?

我是 JAVA 的新手,刚开始学习“IS-A”和“HAS-A”关系,但我并没有真正理解。

“IS-A”和“HAS-A”有什么区别?
什么时候应该使用“IS-A”,什么时候应该使用“HAS-A”?

IS-A关系是继承。继承的 classes 称为子 classes 或子 classes。另一方面,HAS-A关系是组合。

在OOP中,IS-A关系是完全继承的。这意味着子 class 是父 class 的一种类型。例如,苹果是一种水果。所以你会延长水果得到苹果。

class Apple extends Fruit {

}

另一方面,组合意味着创建引用其他对象的实例。例如,一个房间有 table。 因此,您将创建一个 class 房间,然后在该 class 中创建一个 table.

类型的实例
class Room {

    Table table = new Table();

}

HAS-A 关系是动态(运行 时间)绑定,而继承是静态(编译时)绑定。 如果您只想重用代码并且您知道这两者不是同一类,请使用组合。例如,您不能从厨房继承烤箱。厨房有烤箱。 当你觉得有像Apple是Fruit这样的自然关系时使用继承。

Foo 是一个 Bar:

public class Foo extends Bar{}

Foo 有一个 Bar

public class Foo {
    private Bar bar;
}