我目前正在阅读一本 Java 书籍,并开始阅读有关继承和多态性的内容。
我正在制作一个存储动物信息的测试程序,我想重载设置动物大小的方法。用户知道狗的大小,但不知道其他动物,因此如果它不是狗,则将动物大小设置为 0,对于狗,它使用自己的带参数的 setSize 方法。
但是,我尝试了两种创建狗的方法,一种是创建动物对象,另一种是创建狗对象。我假设即使 testDog1 变量是 Animal 类型,它仍然能够重载 Dog 类的方法,因为它是一个狗对象。
谁能解释一下为什么 testDog1 不起作用但 testDog2 起作用?
public class Loader {
public static void main(String[] args){
int dogSize = 100;
Animal testDog1 = new Dog();
testDog1.setSize(dogSize);
Dog testDog2 = new Dog();
testDog2.setSize(dogSize);
}
}
public class Animal {
public int size;
public void setSize(){
size = 0;
System.out.println(size);
}
}
public class Dog extends Animal {
public void setSize(int dogSize){
size = dogSize;
System.out.println(size);
}
}
最佳答案
如果您要在代码中引用 testDog1
,编译器会认为它属于 Animal
类。这意味着您可以使用 Cat
或 Bird
或其他任何不存在 setSize(int)
的实例重新分配它。
在 testDog1
被声明为 Animal
类型后,您需要遵守该类的约定。
它当前是一个Dog
这一事实并不会使Dog
的特定方法可见。不过,您可能会在本书的下一章中了解选角。
关于java - 与java方法重载的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32071123/