这两种物体创造的区别是:汽车是超类,丰田是子类.
汽车t=新丰田();丰田t=新丰田();
(我相信我们不能这样做:丰田t=新车();.为什么?)
遗传令我困惑,多态也是如此.如能提供任何帮助,将不胜感激。
发布于 2013-12-07 19:37:20
区别在于对象t
的类型:在第一种情况下,只有car
的方法可用,而在第二种情况下,您也可以得到toyota
-specific方法(如果有的话)。
下面是一个示例:
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();
您可以调用drive
和stop
,但不能调用rollUpWindows
。如果你宣布
toyota c = new toyota();
您可以调用所有三种方法。
有一个https://stackoverflow.com/a/384067/335858的一般概念,类似于上面的案例#1。
发布于 2013-12-07 19:42:07
创造是一样的。访问创建的对象的方式不同。让我们使用一个稍微修改过的示例:
Car c = new ();
AutomaticTransmissionCar a = new AutomaticTransmissionCar();
StandardTransmissionCar s = new StandardTransmissionCar();
Car c = new AutomaticTransmissionCar();
a.drive();
s.drive();
c.drive();
想必,用于drive()
的AutomaticTransmissionCar
方法与StandardTransmissionCar
的drive()
方法有很大的不同。这是多态性的关键:当我们调用c.drive()
时,car会自动确定要使用的正确的drive()
方法。
(请注意,这可能不是最好的设计,只用于说明这里的概念。)
发布于 2013-12-07 19:45:28
让我们从第二个创建开始(这是最简单的):这里您创建了一个丰田对象,在您的整个程序过程中,它将是一个丰田,它将拥有他所有的特定属性和方法,以及它从car继承的受保护的/公共的属性和受保护的/公共的方法。
第一个创造也是有效的,但是多多益善的,缺点是你将无法解决丰田的具体属性和方法,因为它只被宣布为一辆汽车。不管在内心深处是辆丰田车,所以当你这么做的时候
Toyota t2 = (Toyota)t;
你把它换成了丰田。
第一个创意之所以行得通,是因为丰田也是一辆汽车。相反,它不起作用,因为汽车不总是丰田,它可以是宝马的雷克萨斯,.因为编译器没有明确的方法来说明是什么,所以这是不允许的。
小贴士:如果你画继承树,继承是很容易的。将超类放在顶部,子类放在下面,等等。进位是向下移动,而不是向上移动。
希望这能把它弄清楚一点
https://stackoverflow.com/questions/20445655
复制相似问题