在java中继承时发生重载错误?

在java中继承时发生重载错误?,java,inheritance,overloading,Java,Inheritance,Overloading,我刚刚学习了java中的重写和重载。这里我试图实现一个重载,但是编译器显示d.speak(3)是错误的 我认为狗继承了动物。所以它有一个speak()函数。我给重载添加了一个speak(int)。为什么我错了?谢谢你。只有狗才能用int参数说话 public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Animal a=

我刚刚学习了java中的重写和重载。这里我试图实现一个重载,但是编译器显示d.speak(3)是错误的


我认为狗继承了动物。所以它有一个speak()函数。我给重载添加了一个speak(int)。为什么我错了?谢谢你。

只有
狗才能
用int参数说话

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Animal a=new Animal();
        a.speak();

        Animal d=new Dog();
        d.speak(3);//           
    }

    class Animal
    {
        public float speak()
        {
            System.out.println("I am a animal!");
            return 0;
        }
    }

    class Dog extends Animal
    {
        public double speak(int a)
        {
            System.out.println("Dog sparks!");
            return 0;
        }
    }
}

如果您想调用
speak
作为
Animal
而不使用强制转换,则所有对象的参数列表必须相同

只有
Dog
可以
speak
使用int参数

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Animal a=new Animal();
        a.speak();

        Animal d=new Dog();
        d.speak(3);//           
    }

    class Animal
    {
        public float speak()
        {
            System.out.println("I am a animal!");
            return 0;
        }
    }

    class Dog extends Animal
    {
        public double speak(int a)
        {
            System.out.println("Dog sparks!");
            return 0;
        }
    }
}

如果要以
Animal
的形式调用
speak
,而不使用强制转换,则所有对象的参数列表都必须相同,因为
Animal
类没有带有该签名的
speak
方法(使用int参数)。 因此,编译器无法在Animal类中找到定义。 你必须先把它放下,就像

Dog dog = new Dog();
dog.speak(3);

EDIT:或者,按照Reimeus的建议,直接将其声明为狗。

这是因为
Animal
类没有带有该签名的
speak
方法(使用int参数)。 因此,编译器无法在Animal类中找到定义。 你必须先把它放下,就像

Dog dog = new Dog();
dog.speak(3);

编辑:或者,按照Reimeus的建议,直接将其声明为狗。

您使用的是动物引用和狗实例。
如果是重写的方法,它将指向引用类中可用的方法。
这里,它将指向Animal类的speak()方法,因为它是被引用的类。
因此,无法找到参数化方法speak(inta)


这种情况在面向对象编程术语中称为子类对象的超类引用。

您使用的是动物引用和狗实例引用。
如果是重写的方法,它将指向引用类中可用的方法。
这里,它将指向Animal类的speak()方法,因为它是被引用的类。
因此,无法找到参数化方法speak(inta)


这种情况在面向对象编程术语中称为子类对象的超类引用。

您在
Dog
中重载了speak方法。 Java对重载方法使用静态绑定,这意味着声明的类型必须具有重载方法。在您的例子中,
Animal
是声明的类型,但它没有
speak(inta)

这就是为什么您必须键入cast:
((Dog)d).speak(3)
以使编译器停止抱怨。

您在
Dog
中重载speak方法。 Java对重载方法使用静态绑定,这意味着声明的类型必须具有重载方法。在您的例子中,
Animal
是声明的类型,但它没有
speak(inta)

这就是为什么您必须键入cast:
((Dog)d)。说出(3)
以使编译器停止抱怨。

因此,当我想要实现多态性时,首先必须确保继承树具有相同的签名。或者我必须将其“转换”为适当的数据类型?@AlexWei多态性仅适用于相同的签名。因此,如果方法接口(通过名称、返回类型和参数名称和类型给出)在层次结构中的所有类中都是相同的,则可以从指向基类(在本例中为动物)的指针调用该方法,运行时将在实际类(在本例中为狗)上调用该方法所以当我想要实现多态性时,首先我必须确保继承树具有相同的签名。或者我必须将其“转换”为适当的数据类型?@AlexWei多态性仅适用于相同的签名。因此,如果方法接口(通过名称、返回类型和参数名称和类型给出)在层次结构中的所有类中都是相同的,则可以从指向基类(在本例中为动物)的指针调用该方法,运行时将在实际类(在本例中为狗)上调用该方法我刚才在你的答案中搜索了
静态绑定
。这真的很有帮助。我只是在你的答案中搜索了
静态绑定
。这真的很有帮助。