问题描述
这是我的代码,非常简单且具有说明性:
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::num
和Dog::num
。 Animal::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。