class Weather{
int humidity;
//default value is 0;
}
class Rainy extends Weather{
void changeHumidity(){
humidity = 10;
System.out.println("The humidity is " + super.humidity);
}
}
public class Test{
public static void main(String[] args){
new Rainy().changeHumidity();
System.out.println(new Weather().humidity);
}
}
这里的输出是: 湿度是10和 0
为什么super.humidity返回10.我知道实例变量不是继承的,但可以在子类中访问它们。如果它们可以在子类中访问那么这意味着它们在超类和子类之间共享或者两者都是超类和子类有不同的副本。现在开始质疑为什么super.humidity返回10但在下一行它返回0。请让我的概念清楚。
答案 0 :(得分:2)
Weather
和Rainy
的每个实例都有自己的humidity
副本。
在changeHumidity()
方法中,您同时引用了humidity
和super.humidity
。这些是指同一个实例变量。当您创建新的Rainy
时,它会继承Weather
的所有内容,这就是您首先可以使用humidity
的原因。
但是,当您创建新的Weather
时,这与您的Rainy
实例完全无关。让我们假设我们有两个对象:
Rainy rainy = new Rainy();
Weather weather = new Weather();
上述每个对象都有自己的humidity
副本。更改实例rainy
上的湿度不会更改实例weather
上的湿度。
rainy.humidity = 20;
System.out.println(weather.humidity); //-> 0
答案 1 :(得分:2)
在Rainy类中不存在字段湿度所以此类使用父类字段进行初始化
如果您在子类中更改了湿度字段,那么可以打印父类字段
答案 2 :(得分:0)
humidity
是instance variable.
实例变量:
这些变量属于类的实例,因此属于对象。和 该类(对象)的每个实例都拥有它自己的副本 变量。对变量所做的更改不会反映在其他变量中 该类的实例。
new Weather()
将创建一个新实例
public class Test{
int x = 5;
}
Test t1 = new Test();
Test t2 = new Test();
t1.x=10
不会对t2.x
进行任何更改。 t2.x
仍为5