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

为什么子类对象在Java中调用父类字段变量?,java,inheritance,polymorphism,field,Java,Inheritance,Polymorphism,Field,这是我的代码,非常简单且具有演示性: 入口: 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 cl

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

入口:

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::num
Dog::num
Animal::call()
只知道
Animal::num
,即100

在子类中声明与超类中的字段同名的字段通常没有帮助。字段不受覆盖;而隐藏一个名字只会导致混乱


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

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

现在,如果您运行
newdog().start()
,您将发现打印了10000条。实例只有一个
num
字段,在
Animal
中声明,并在
Dog
中设置为10000。您的实例有两个字段:
Animal::num
Dog::num
Animal::call()
只知道
Animal::num
,即100

在子类中声明与超类中的字段同名的字段通常没有帮助。字段不受覆盖;而隐藏一个名字只会导致混乱


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

class Dog extends Animal {
    public Dog() {
        num = 10000;
    }
    public void start() {
        this.call();
    }
}
现在,如果您运行
newdog().start()
,您将发现打印了10000条。该实例只有一个
num
字段,在
Animal
中声明,并在
Dog
中设置为10000