【问题标题】:Creating objects in Java (Inheritance & Polymorphism)在 Java 中创建对象(继承和多态)
【发布时间】:2013-12-25 02:07:28
【问题描述】:

car 是超类,toyota 是子类,这两个对象创建有什么区别...

汽车 t = 新丰田(); 丰田 t = new toyota();

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

继承让我感到困惑,多态性也是如此......任何帮助将不胜感激

【问题讨论】:

  • 我推荐你阅读 SCJP 1.6 Programmer +
  • 我认为这是一份认证指南,而且可能更高级......我是一名高中生
  • 要理解多态,你需要一个更完整的例子。请参阅下面的答案,如果有不清楚的地方,请随时提出更多问题。
  • 我不认为这是一本复杂的书,你可以专门尝试一下多态性,然后再决定你是否感兴趣。

标签: java object inheritance polymorphism declaration


【解决方案1】:

区别在于对象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。

【讨论】:

  • 谢谢 :) 我现在明白了
  • 从我所看到的情况来看,这个概念真的很好,但我现在只是将其添加为书签,因为我还没有阅读过有关接口的内容......
【解决方案2】:

创作是一样的。您访问创建的对象的方式是不同的。让我们用一个稍加修改的例子:

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

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

据推测,AutomaticTransmissionCardrive() 方法与StandardTransmissionCardrive() 方法大不相同。这是多态性的关键:当我们调用c.drive()时,汽车会自动确定要使用的正确drive()方法。

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

【讨论】:

  • 通过比较签名来判断?
  • @ArnZXY 在这个设计中,drive() 是在Car 类中声明的抽象方法,在AutomaticTransmissionCarStandardTransmissionCar 中实现。为了使多态性起作用,所有这三个的签名必须完全相同。使用哪个drive() 方法在运行时根据变量c具体类型 确定。简而言之,Java 知道c真的AutomaticTransmissionCar,因此使用了它的drive() 方法。
【解决方案3】:

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

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

Toyota t2 = (Toyota)t; 

您已将其更改(铸造)为丰田。

第一个创作之所以有效,是因为丰田也是汽车。反过来是行不通的,因为汽车并不总是丰田,它可以是雷克萨斯的宝马,....并且因为编译器无法确定可以是什么,所以这是不允许的.

小提示:如果你画了继承树,继承很容易。将超类放在上面,将子类放在它下面,依此类推。继承工作向下传播,而不是向上传播

希望这能稍微清除一下

【讨论】:

    【解决方案4】:

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

    如果t 是对car 的引用,则它可以包含任何类型的car - 丰田、本田、法拉利,应有尽有。但是,如果将t 定义为toyota,则它不能容纳任何旧的car,只能容纳toyotas。

    【讨论】:

      【解决方案5】:

      这样想:car 是超类,而 toyota 是子类(意味着它继承自 car),换句话说,说每辆 toyota 是一辆汽车是有道理的,但不是说每辆汽车都是 toyota。这是两个类之间的 IS-A 关系示例(Toyota IS-A 汽车)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-24
        • 2013-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多