这两个对象创作之间的区别是 car 是超类而 toyota 是子类......
car t = new toyota(); toyota t = new toyota();
(我相信我们不能这样做: toyota t = new car(); ....为什么?)
继承令我困惑,多态性也是如此......任何帮助都会受到赞赏
答案 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();
您可以拨打drive
和stop
,但不能拨打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
。这意味着toyota
是isA
的一种(或更确切地说,car
)种类。每个toyota
也是car
,但不是每个car
都是toyota
(例如,其中一些可能是本田)。
如果t
是对car
的引用,它可以包含任何类型的car
- 丰田,本田,法拉利,你可以命名。但是,如果将t
定义为toyota
,则不能保留任何旧car
,只能保留toyota
。
答案 4 :(得分:0)
以这种方式思考:汽车是一个超类,丰田是子类(意味着它继承自汽车),换句话说,说每辆丰田都是汽车是有意义的,但不是每辆汽车都是丰田汽车。这是两个类(丰田IS-A汽车)之间的IS-A关系的一个例子。