为什么不能调用bark方法

时间:2015-06-01 12:51:03

标签: java inheritance

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类变量中。但它显示我编译时错误。谁能解释为什么?

5 个答案:

答案 0 :(得分:2)

这是它的工作方式。

当编译器试图检测谁是d时。它见。

Animal d

编译器不知道如何创建它,查看引用类型。因此,dAnimal

现在引用为AnimalAnimal是否有bark()方法?没有。的错误

可能d内部是Dog,但编译器并不知道,编译器也不应该知道,编译器会翻译你在这种情况下对d所说的内容。这就是你收到错误的原因。

现在你可以说我希望d充当Dog,因为我知道dDog 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