我有一个界面 MyInterface ,有两种方法 doSomething ()和 doSomethingElse ()。
我有一个实现此接口的抽象公共类 A 。 我有一个 C 类扩展了类 A ,因此也实现了接口的方法。 在main方法中,我将类C的对象分配给MyInterface引用,如: MyInterface myiface = new C();
问题在于,如果我在任一类(抽象或具体)中添加一些方法,我就无法通过引用myiface调用该方法。我必须先把它贬低。 我不应该能够以多态方式访问该类,因为它显示在 Java SE8 for Deitel 程序员(第10章多态性和接口)一书中?
答案 0 :(得分:1)
我不应该以多态方式访问该类...
您可以 - 如果您的变量类型属于C
类型。但它不是,它是类型MyInterface
,并且完全定义了您可以访问的实例的哪些功能。是的,实例具有更多功能,但写入接口的代码不知道。
向C
添加功能与多态无关。在这种情况下,多态性(有几种不同的类型)是A
和C
可以用不同的方式实现MyInteface
的功能 ,但是通过MyInterface
引用使用实例的代码既不知道也不关心实例是A
s还是C
s;所有它知道,应知道的一切,是他们声称是MyInterface
的忠实实现。
我们举一个具体的例子:
public void doSomethingWith(List list) {
// ...
}
当某些内容调用doSomethingWith
时,它会传入一个满足List
接口的实例。该方法知道该实例 all (缺少instanceof
和getClass
之类的内容)。该实例可以是ArrayList
,LinkedList
,Stack
等;但使用它的代码不知道或不关心它。它只知道它是List
。即使该方法传递了ArrayList
,它也不能使用(比方说)ensureCapacity
而不首先向下转换引用(如果实例不是ArrayList
则会失败),因为并非所有List
实施都有ensureCapacity
。
答案 1 :(得分:0)
想想这样......假设你的MyInterface被命名为'Animal',你有两个实现它的类,名为'Dog'和'Cow'。只是因为它们都是动物你不会指望狗突然给牛奶,对吗?在这个比喻中,giveMilk()是一个只由Cow类实现的方法。
你知道了吗?