【发布时间】:2018-05-10 08:51:55
【问题描述】:
(之前问过here的问题。我没有得到想要的答案。)
引用一本书:
如果你想从一个对象调用一个由子类定义的方法怎么办? 是由超类的变量引用的?假设 SoftBall 类 有一个名为riseBall 的方法,它不是由 Ball 类定义的。你怎么 从 Ball 变量中调用它?一种方法是创建子变量 类,然后使用赋值语句来转换对象:
Ball b = new SoftBall();
SoftBall s = (SoftBall)b;
// cast the Ball to a
// SoftBall
s.riseBall();
在上面的代码 sn-p 中,它显示了一个新的 Softball 对象正在创建并分配为对变量 b 的引用,这是完全合法的,因为类Softball 是 Ball 类的子类。然而,引用声明(间接)您必须先将变量转换为类型 Softball,然后才能使用该变量调用 Softball 类中的方法。这是为什么?为什么我不能直接使用 Ball 类型的变量 b(其中包含对垒球对象的引用)来调用所需的方法?变量 b 已经拥有该对象。
(注意:我已经阅读了this 的帖子。)
【问题讨论】:
-
创建
b类型Ball的变量是告诉编译器“这个变量中的对象可以是Ball类型的任何东西”。如果您想让编译器知道变量所持有的对象是SoftBall,请使用SoftBall类型的变量。这就是变量类型的用途。 -
引用您引用的答案:
The declared type of the variable a is A. The compiler doesn't know (and shouldn't know) what its concrete type at runtime is B.。 -
只有当 Ball 是抽象的并且有一个抽象的
riseBall()方法时,您的预期场景才有可能。 -
认为这些概念会帮助你理解答案——java中的多态性和后期绑定
标签: java inheritance