用Java创建对象(继承和多态)

时间:2013-12-07 19:35:09

标签: java object inheritance polymorphism declaration

这两个对象创作之间的区别是 car 是超类而 toyota 是子类......

car t = new toyota(); toyota t = new toyota();

(我相信我们不能这样做: toyota t = new car(); ....为什么?)

继承令我困惑,多态性也是如此......任何帮助都会受到赞赏

5 个答案:

答案 0 :(得分:3)

区别在于对象t的类型:在第一种情况下,只有car的方法可用,而在第二种情况下,您也可以得到toyota - 具体方法,如果有的话。

以下是一个例子:

public class car {
    public void drive() {...}
    public void stop() {...}
}
public class toyota extends car {
    public void drive() {... /*toyota-specific code*/}
    public void stop() {... /*toyota-specific code*/}
    public void rollUpWindows() {...}
}

如果您声明

car c = new toyota();

您可以拨打drivestop,但不能拨打rollUpWindows。如果你宣布

toyota c = new toyota();

你可以调用这三种方法。

programming to an interfaces的一般概念与上面的案例#1类似。

答案 1 :(得分:1)

创作是一样的。如何访问创建的对象是不同的。让我们使用一个稍微修改过的例子:

Car c = new ();
AutomaticTransmissionCar a = new AutomaticTransmissionCar();
StandardTransmissionCar s = new StandardTransmissionCar();
Car c = new AutomaticTransmissionCar();

a.drive();
s.drive();
c.drive();

据推测,drive()的{​​{1}}方法与AutomaticTransmissionCar的{​​{1}}方法大不相同。这是多态的关键:当我们调用drive()时,汽车会自动确定要使用的正确StandardTransmissionCar方法。

(请注意,这可能不是最好的设计,仅用于说明这里的概念。)

答案 2 :(得分:1)

让我们从第二次创作开始(这是最简单的创作): 在这里,您将创建一个丰田对象,并且对于您的程序的整个过程,这将是一个丰田,它具有所有特定的属性和方法以及受保护/公共属性以及受保护的公共方法。

第一个创建也有效,但是多边形,缺点是你将无法解决丰田特定的属性和方法,因为它只被声明为Car。不过在内心深处它是丰田,所以当你这样做时

Toyota t2 = (Toyota)t; 

你已经改变(铸造)给丰田了。

第一次创作是因为丰田也是一辆汽车。反过来不起作用,因为汽车并不总是丰田,它可以是雷克萨斯的宝马,......并且因为编译器无法确定可能是什么,这是不允许的

小提示:如果绘制继承树,继承很容易。将超类放在顶层,将子类置于其下,依此类推。旅行工作下来,而不是向上旅行

希望这有点清除

答案 3 :(得分:0)

在您的示例中,toyota扩展了car。这意味着toyotaisA的一种(或更确切地说,car)种类。每个toyota也是car,但不是每个car都是toyota(例如,其中一些可能是本田)。

如果t是对car的引用,它可以包含任何类型的car - 丰田,本田,法拉利,你可以命名。但是,如果将t定义为toyota,则不能保留任何旧car,只能保留toyota

答案 4 :(得分:0)

以这种方式思考:汽车是一个超类,丰田是子类(意味着它继承自汽车),换句话说,说每辆丰田都是汽车是有意义的,但不是每辆汽车都是丰田汽车。这是两个类(丰田IS-A汽车)之间的IS-A关系的一个例子。