继承和创建新类之间的区别

时间:2017-12-07 22:00:58

标签: java object inheritance

这两者之间有什么区别:

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中的变量。

但是我不知道我什么时候应该先使用第一个而不是第二个,哪个更好,等等。

有人可以解释一下这个区别吗?

3 个答案:

答案 0 :(得分:2)

在第一个示例中,您说“我希望Car为某些计算机分配值10(CarMachine实际上没有关联},它可能是“门”,“车库”或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类。