java - 多态性是否适用于 Java 中的类属性?

标签 java polymorphism

我知道 OOP 中多态性的常见用法发生在父类引用用于引用子类对象时,如下所示:

Animal animal = new Animal();
Animal dog = new Dog();

而且我知道多态适用于类方法,但它是否也适用于类属性?我试图用这个小例子来测试它:

public class Main{

    public static void main(String args[]){
        Animal animal = new Animal();
        Animal dog1 = new Dog();
        Dog dog2 = new Dog();

        System.out.println("Animal object name: " + animal.name);
        System.out.println("Dog1 object name: "+dog1.name);
        System.out.println("Dog2 object name: " + dog2.name);

        animal.print();
        dog1.print();
        dog2.print();
    }

}
class Animal{
    String name = "Animal";
    public void print(){
        System.out.println("I am an: "+name);
    }
}
class Dog extends Animal{
    String name = "Dog";
    public void print(){
        System.out.println("I am a: "+name);
    }
}

这是输出:

Animal object name: Animal
Dog1 object name: Animal
Dog2 object name: Dog
I am an: Animal
I am a: Dog
I am a: Dog

如您所见(我希望它是清楚的),多态性与 print() 方法一起工作良好,但对于类属性“name”,它取决于引用变量。

那么,我说得对吗?多态性不适用于类属性?

最佳答案

当您扩展一个类时,方法会被覆盖,但字段会被隐藏。动态调度适用于方法,但不适用于字段。语言为什么这么设计,天知道为什么。

关于java - 多态性是否适用于 Java 中的类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32288342/

相关文章:

java - 修复 Zxing (Obj-C) 中的 Aztec 解码器以返回原始 ByteArray

java - 在 Array 与 ArrayList 中转换对象并调用该对象的方法

json - 在 Kotlin 中使用 Jackson 进行多态(反)序列化时缺少身份字段

swift - 在运行时,Swift 如何知道要使用哪个实现?

c++ - 对虚拟表的混淆

java - 如何将一个对象转换为同一基类的不同对象?

java - BorderPane 重叠内容

java - Android 一个 channel 多个通知

java - 如何使用 Selenium 中的以下子元素检索没有标签的元素的文本

java - 文本观察者问题