Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中创建对象(继承和多态性)_Java_Object_Inheritance_Polymorphism_Declaration - Fatal编程技术网

在Java中创建对象(继承和多态性)

在Java中创建对象(继承和多态性),java,object,inheritance,polymorphism,declaration,Java,Object,Inheritance,Polymorphism,Declaration,这两个物体创造之间的区别是什么,汽车是超级类,丰田是子类 汽车t=新丰田(); 丰田t=新丰田() (我相信我们不能这样做:丰田t=新车();…为什么?) 继承让我困惑,多态也让我困惑。。。任何帮助都将不胜感激区别在于对象的类型t:在第一种情况下,只有car的方法可用,而在第二种情况下,您还可以使用toyota特定的方法(如果有的话) 以下是一个例子: public class car { public void drive() {...} public void stop()

这两个物体创造之间的区别是什么,汽车是超级类,丰田是子类

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

(我相信我们不能这样做:丰田t=新车();…为什么?)


继承让我困惑,多态也让我困惑。。。任何帮助都将不胜感激

区别在于对象的类型
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();
toyota c = new toyota();
您可以调用
驱动器
停止
,但不能调用
滚动窗口
。如果你申报

car c = new toyota();
toyota c = new toyota();
您可以调用这三种方法


有一个与上述案例1类似的一般概念。

在您的示例中,
丰田
扩展了
汽车
。这意味着
toyota
是一种(或者更确切地说,
isA
)类型的
汽车。每辆
丰田
也是一辆
汽车
,但并非每辆
汽车
都是
丰田
(例如,其中一些可能是本田)


如果
t
指的是
汽车
,那么它可以容纳任何类型的
汽车
——丰田、本田、法拉利,随便你怎么说。但是,如果将
t
定义为
toyota
,则它不能容纳任何旧车
,只是
toyota
s.

创建是相同的。访问已创建对象的方式不同。让我们使用一个稍加修改的示例:

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

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


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

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

第一个创建也是有效的,但具有多病态性,缺点是您无法解决丰田特定的属性和方法,因为它仅被声明为汽车。不管它是丰田汽车,所以当你这么做的时候

Toyota t2 = (Toyota)t; 
你把它换成了丰田

第一个创意之所以奏效,是因为丰田也是一辆汽车。另一种方法是行不通的,因为汽车并不总是丰田,它可以是雷克萨斯的宝马。。。。而且因为编译器没有确定的方法来告诉什么是可以的,这是不允许的

小提示:如果绘制继承树,那么继承很容易。将超类放在上面,子类放在下面,依此类推。内在作用是向下移动,而不是向上移动


希望这能澄清一点

这样想:汽车是一个超类,丰田是一个子类(意味着它继承自汽车),换句话说,说每辆丰田都是一辆汽车是有意义的,但不是说每辆车都是丰田。这是两个等级(丰田is-A汽车)之间is-A关系的一个例子。

我建议您阅读SCJP 1.6程序员+我认为这是一个认证指南,可能更高级。。。我是一名高中生要理解多态性,你需要一个更完整的例子。看看下面的答案,如果有什么不清楚的地方,可以问更多的问题。我不认为这是一本复杂的书,请具体尝试一下多态性,然后决定您是否感兴趣。谢谢:)我现在知道了,从我看到的来看,这个概念非常好,但我现在只是将它添加到书签中,因为我还没有读过关于接口的内容……它通过比较签名来确定?@ArnZXY在这个设计中,
drive()
是一种抽象方法,在
Car
类中声明,在
AutomaticTransmissionCar
standardcransmissioncar
中实现。为了使多态性发挥作用,这三种类型的签名必须完全相同。要使用的
drive()
方法在运行时根据变量
c
的具体类型确定。简单地说,Java知道
c
实际上是一种
自动传输汽车
,因此使用了它的
drive()
方法。