英文:
Why is the child class object invoking the parent class field variable in 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?如何理解这个问题?
英文:
This is my code, pretty simple and demonstrative:
JVM entrance:
class Demo {
public static void main(String[] args) {
new Dog().start();
}
}
Parent class:
public class Animal {
int num = 100;
public void call() {
System.out.println(this.num);
}
}
Child class:
public class Dog extends Animal{
int num = 10000;
public void start() {
this.call();
}
}
Console output: 100
Why it's 100, not 10000? How to comprehend this?
答案1
得分: 2
你的实例有两个字段: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();
}
}
现在,如果你运行 new Dog().start(),你会发现输出的是10000。实例只有一个 num 字段,它在 Animal 中声明,并且在 Dog 内部设置为10000。
英文:
Your instance has two fields: Animal::num and Dog::num. Animal::call() only knows about Animal::num, which is 100.
It is not usually helpful to declare a field in a subclass with the same name as a field in the superclass. Fields are not subject to overriding; and shadowing a name only leads to confusion.
Suppose that instead of declaring a new num field in Dog, you set the existing num field to a new value.
class Dog extends Animal {
public Dog() {
num = 10000;
}
public void start() {
this.call();
}
}
Now if you run new Dog().start(), you will find that 10000 is printed. The instance has only one num field, declared in Animal, and set to 10000 inside Dog.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论