为什么子类对象在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