在java中继承时发生重载错误?
我刚刚学习了java中的重写和重载。这里我试图实现一个重载,但是编译器显示d.speak(3)是错误的在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=
我认为狗继承了动物。所以它有一个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多态性仅适用于相同的签名。因此,如果方法接口(通过名称、返回类型和参数名称和类型给出)在层次结构中的所有类中都是相同的,则可以从指向基类(在本例中为动物)的指针调用该方法,运行时将在实际类(在本例中为狗)上调用该方法我刚才在你的答案中搜索了静态绑定
。这真的很有帮助。我只是在你的答案中搜索了静态绑定
。这真的很有帮助。