在Java中创建对象(继承和多态性)
这两个物体创造之间的区别是什么,汽车是超级类,丰田是子类 汽车t=新丰田(); 丰田t=新丰田() (我相信我们不能这样做:丰田t=新车();…为什么?)在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
:在第一种情况下,只有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()
方法。