class Animal{
void run() {
}
}
class Dog extends Animal {
void bark() {
}
}
class Testing{
public static void main(String[] args) {
Animal d = new Dog();
d.run();
d.bark();
}
}
我试图使用dog类的对象调用bark方法,其类引用存储在Animal类变量中。但它显示我编译时错误。谁能解释为什么?
答案 0 :(得分:2)
这是它的工作方式。
当编译器试图检测谁是d
时。它见。
Animal d
编译器不知道如何创建它,查看引用类型。因此,d
是Animal
。
现在引用为Animal
。 Animal
是否有bark()
方法?没有。的错误
可能d
内部是Dog
,但编译器并不知道,编译器也不应该知道,编译器会翻译你在这种情况下对d
所说的内容。这就是你收到错误的原因。
现在你可以说我希望d
充当Dog
,因为我知道d
是Dog
by,
((Dog) d);
然后拨打bark()
((Dog) d).bark();
因此编译器仅将d
作为Dog
用于此操作。
答案 1 :(得分:1)
这是因为您将狗存储在Animal
类型的变量中,该变量只能run()
。可能有另一只动物Cat
无法bark()
。
如果您想让狗bark()
,那么您需要输入一个Dog
类型的变量:
Dog rolf = new Dog();
rolf.bark();
答案 2 :(得分:0)
您已将d
声明为Animal
。
但是,虽然内部d
可能是Dog
,但存储为Animal
只允许您使用Animal
中声明的方法。
答案 3 :(得分:0)
您可以使用显式强制转换来调用它
((Dog)d).bark();
答案 4 :(得分:0)
您只能调用引用类型中定义的方法。因为Animal类只有一个方法(run())你就不能在它上面调用bark(),即使它引用了Dog对象。
您正在做的是向上转发,您可以了解有关向上转发和向下转发的更多信息here