Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不能调用bark方法_Java_Inheritance - Fatal编程技术网

Java 为什么不能调用bark方法

Java 为什么不能调用bark方法,java,inheritance,Java,Inheritance,我试图使用dog类的对象调用bark方法,该对象的引用存储在Animal类变量中。但它向我展示了编译时错误。有人能解释为什么吗?你已经宣布d为动物 然而,虽然内部d可能是狗,但作为动物存储只允许您使用在Animal中声明的方法。这是因为您将狗存储在只能运行的Animal类型变量中。可能还有另一只猫不会叫 如果要让狗吠叫,则需要输入狗类型变量: class Animal{ void run() { } } class Dog extends Animal { void ba

我试图使用dog类的对象调用bark方法,该对象的引用存储在Animal类变量中。但它向我展示了编译时错误。有人能解释为什么吗?

你已经宣布d为动物


然而,虽然内部d可能是狗,但作为动物存储只允许您使用在Animal中声明的方法。

这是因为您将狗存储在只能运行的Animal类型变量中。可能还有另一只猫不会叫

如果要让狗吠叫,则需要输入狗类型变量:

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();
    }
}
这就是它的工作原理

当编译器试图检测谁是d。?是的,看

Dog rolf = new Dog();
rolf.bark();
编译器不知道它是如何创建的,请查看引用类型。所以,d是一种动物

现在参考的是动物。动物有树皮法吗?不,是错误

可能是d里面有只狗,但编译器不知道这一点,编译器也不应该知道,在这种情况下,编译器会翻译你们所说的关于d的内容。这就是为什么你会出错

现在你可以看出我想让d扮演狗的角色,因为我知道d是一只狗

然后叫树皮


所以编译器只会将d作为此操作的狗

您可以使用显式cast调用它

((Dog) d).bark();

只能调用引用类型中定义的方法。i、 e由于Animal类只有一个运行的方法,所以不能对其调用bark,即使它引用的是Dog对象


您所做的是向上投射,您可以了解更多关于向上投射和向下投射的信息

那么我如何访问树皮方法?您必须在动物中声明树皮,或者将d声明为类狗狗d=新狗;。那么我怎样才能访问bark方法?@ManishKumar我已经扩展了答案。我猜bark问题来自于你的继承树……你应该解释为什么你的代码可以工作,所以op will learnI确实说了显式转换,这在java文档中有详细的解释。看看op问题,很明显,他没有完全理解继承和多态性的概念。在这方面,给出一个技术性的、单行线的解决方案对他没有多大帮助。那么使用动物d=新狗有什么好处呢?用狗d=新狗不是更好吗?
((Dog) d);
((Dog) d).bark();
((Dog)d).bark();