继承混淆与java方法重载
我目前正在阅读一本Java书籍,并开始阅读有关继承和多态性的内容
我正在制作一个存储动物信息的测试程序,我想重载设置动物大小的方法。用户知道狗的大小,但不知道其他动物的大小,因此,如果不是狗,则将动物大小设置为0,对于狗,它使用自己的带有参数的setSize方法
然而,我尝试了两种创建狗的方法,一种是创建动物对象,另一种是创建狗对象。我假设,即使testDog1变量是Animal类型,它仍然能够重载Dog类中的方法,因为它是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);
}
}
# 1 楼答案
您的
testDog1
在Animal
类中找不到setSize(int dogSize)
方法,因此这是一个编译错误。 其中astestDog2
在Dog
类中找到setSize(int dogSize)
方法,它将编译# 2 楼答案
testDog1是一个
Animal
对象。如果不将它强制转换为Dog
,它就不知道setSize(int)
存在(Dog)testDog1.setSize(dogSize)
告诉编译器它实际上是一只狗# 3 楼答案
如果你要引用你的代码中的^ {CD1>},编译器会认为它是类^ {CD2>}。这意味着您可以使用
Cat
或Bird
或其他任何不存在setSize(int)
的实例重新分配它在
testDog1
被声明为Animal
类型后,您需要遵守该类的约定它目前是一个
Dog
的事实并不能使Dog
的具体方法可见。不过,您可能会在本书的下一章中了解铸造# 4 楼答案
只有在运行程序时,才会创建Dog实例并将其分配给testDog1变量。即运行时
在检查正确性时,编译器不会运行程序,也不会对每个语句或变量的性质做出硬性假设。如果是这样的话,下面的stmt也会是编译时错误
# 5 楼答案
在编译时,编译器只知道在
testDog1
中有一个对Animal
的引用。由于Animal
没有setSize(int)
,编译器无法找到它,因此失败重要的是要知道哪些操作是在编译时完成的(编译器知道变量的类型),哪些操作是在运行时完成的(运行时知道对象的实际实例)