java - 与java方法重载的混淆

标签 java inheritance polymorphism subclass superclass

我目前正在阅读一本 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 类。这意味着您可以使用 CatBird 或其他任何不存在 setSize(int) 的实例重新分配它。

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

它当前是一个Dog这一事实并不会使Dog的特定方法可见。不过,您可能会在本书的下一章中了解选角。

关于java - 与java方法重载的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32071123/

相关文章:

Java,将 double 舍入到小数点后两位(舍入到 0.05)

Java 多线程——更多的线程做的更少,还是更少的线程做的更多?

c++ - 接口(interface)方法的实现

java - 为什么动态调度的目标不是在编译时确定的?

Java继承和重写方法——修饰符的影响

C++ 多态性和可变参数模板

java - java方法的理想长度

java - 当用 HystrixCommand 注释的方法调用另一个抛出异常的方法时,断路器不起作用

c++ - 访问与父类是 friend 的类的私有(private)成员

python - 如何通过继承在python中对请求进行子类化