有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承混淆与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);

    }

}

共 (5) 个答案

  1. # 1 楼答案

    您的testDog1Animal类中找不到setSize(int dogSize)方法,因此这是一个编译错误。 其中astestDog2Dog类中找到setSize(int dogSize)方法,它将编译

  2. # 2 楼答案

    testDog1是一个Animal对象。如果不将它强制转换为Dog,它就不知道setSize(int)存在

    (Dog)testDog1.setSize(dogSize)告诉编译器它实际上是一只狗

  3. # 3 楼答案

    如果你要引用你的代码中的^ {CD1>},编译器会认为它是类^ {CD2>}。这意味着您可以使用CatBird或其他任何不存在setSize(int)的实例重新分配它

    testDog1声明为Animal类型后,您需要遵守该类的约定

    目前是一个Dog的事实并不能使Dog的具体方法可见。不过,您可能会在本书的下一章中了解铸造

  4. # 4 楼答案

     Animal testDog1 = new Dog();
    

    只有在运行程序时,才会创建Dog实例并将其分配给testDog1变量。即运行时

    在检查正确性时,编译器不会运行程序,也不会对每个语句或变量的性质做出硬性假设。如果是这样的话,下面的stmt也会是编译时错误

    Animal testDog = null;
    testDog.setSize(); // How can you call setSize() on null right? for the same reason mentioned above.
    
  5. # 5 楼答案

    在编译时,编译器只知道在testDog1中有一个对Animal的引用。由于Animal没有setSize(int),编译器无法找到它,因此失败

    重要的是要知道哪些操作是在编译时完成的(编译器知道变量的类型),哪些操作是在运行时完成的(运行时知道对象的实际实例)