这两者之间有什么区别:
class Machine {
public int x = 2;
}
class Car {
public void start(Machine myMachine) {
myMachine.x = 10;
}
}
和
class Machine {
public int x = 2;
}
class Car extends Machine {
public void start() {
super.x = 10;
}
}
在第一个示例中,我使用Car
类创建了一种新类型的对象,我可以使用x
类中的变量Machine
。
在第二个示例中,我从Machine
类继承到Car
类,因此我可以在Machine
中使用Car
中的变量。
但是我不知道我什么时候应该先使用第一个而不是第二个,哪个更好,等等。
有人可以解释一下这个区别吗?
答案 0 :(得分:2)
在第一个示例中,您说“我希望Car
为某些计算机分配值10(Car
与Machine
实际上没有关联},它可能是“门”,“车库”或Car
可以与Car
合作的其他类,但它们不属于“汽车是......”)变量{{1 }}“
在第二个中你说“x
是一台机器,我希望它能够改变它自己的值 Car
变量为10“。 (你可以说“我希望我的车开始自己的引擎”。
我知道在第一个例子中我正在创建一种新对象(我是对的吗?) - 它不是通过将它作为参数传递来创建新的x
引用。您宁愿说您希望Machine
类的实例能够更改一个特定的Machine类实例的Car
值。不是所有机器,只是作为x
方法的参数传递的机器。示例:start()
Car有一个功能可以在你想要的时候打开门,但Car myFerrari.start(gateThree)
一个门。
但我不知道我应该何时使用第一个,哪个更好,等等。在第二个例子中,你说Car 是机器 - 因此它能够执行机器能够执行的所有操作,并且还能够执行特定于汽车而不是所有机器的某些操作。要使用继承,您应该确定可以说Car 是计算机。
答案 1 :(得分:1)
第一种有时称为'使用'关系,如'汽车使用机器',而第二种有时被称为'是-a'关系,如'汽车是机器'。这第二种关系称为继承。有第三种广泛的类型,你在这里没有显示的'has-a'关系:
class Machine {}
class Car {
Machine machine;
}
第一种关系比第二种关系容易理解。通常情况下,如果我们想要将一个子类(在您的示例中为Car)替换为从同一父(Machine)派生的另一个子类,我们只对第二个进行建模。
答案 2 :(得分:0)
当一个类需要是类型的某个其他类时使用继承,因为它们共享一些属性。所以在这种情况下,Car可能是类型的机器,也许可以定义或扩展机器中的变量或函数。
如果一个类只需要访问或使用Machine对象(它的变量或函数),那么最好使用你的第一个例子。也许你想要一个MachineManager或MachineList类。