Java的细节太多,几天不看就有些晕~~~~
public class A {
protected String a = "1";
public String getA(){
return this.a;
}
}
public class B extends A {
protected String a = "2";
// public String getA(){
// return a;
// }
public static void main(String[] args) {
B x = new B();
System.out.println(x.getA());
}
}
输出的是1,父类的方法看到的变量是父类中的a。
如果B中也写一个getA方法,看到的a就是子类中的a了。
所以,不要妄想子类重新声明变量的值就可以一了百了啦。
其实就是可见性的问题。
父类和子类的变量是同时存在的,即使是同名。
子类中看到的是子类的变量,父类中看到的是父类中的变量。
它们互相隐藏,而同名的方法则是实实在在的覆盖。
如A x = new B();
x是一个B,也是一个A,
那么调用方法时,是根据对象的实际类型调用的,
实际类型是B,所以永远调用子类的方法。
而访问成员变量就不同了,它是B时,访问的是子类的成员变量,
转型为A的话,访问的就是父类的成员变量了。