为什么子类对象在Java中调用父类字段变量?

问题描述

这是我的代码,非常简单且具有说明性:

JVM入口:

class Demo {
    public static void main(String[] args) {
        new Dog().start();
    }
}

父类

public class Animal {
    int num = 100;
    public void call() {
        System.out.println(this.num);
    }

}

儿童班:

 public class Dog extends Animal{
        int num = 10000;
        public void start() {
            this.call();
        }
    }

控制台输出:100

为什么是100,而不是10000?如何理解呢?

解决方法

您的实例具有两个字段:Animal::numDog::numAnimal::call()仅知道Animal::num,即100。

在子类中声明与超类中的字段同名的字段通常无济于事。字段不受覆盖;和隐藏名称只会导致混淆。


假设您没有在num中声明新的Dog字段,而是将现有的num字段设置为新值。

class Dog extends Animal {
    public Dog() {
        num = 10000;
    }
    public void start() {
        this.call();
    }
}

现在,如果运行new Dog().start(),将发现已打印10000。该实例只有一个num字段,在Animal中声明,并在Dog内部设置为10000。