当子类覆盖父类的成员变量时,父类方法使用的是父类的成员变量,子类方法使用的是子类的成员变量。 这个听起来很容易理解的一回事,但是实际使用过程中很多人容易搞混:尤其是在多态的时候,调用一个被继承的方法,该方法访问是一个被覆盖的成员m,那么方法中到底是访问了父类的成员还是子类的成员m?结论是,若实际调用的是父类的方法,就使用了父类的该成员m,若实际调用的是子类的方法,就使用子类的成员m,记住一句,每个类使用成员在前面都隐含着一个this指针:A.this.member
class SuperClass {
private int number;
public SuperClass() {
this.number = 0;
}
public SuperClass(int number) {
this.number = number;
}
public int getNumber() {
number++;
return number;
}
}
class SubClass1 extends SuperClass {
public SubClass1(int number) {
super(number);
}
}
class SubClass2 extends SuperClass {
private int number;
public SubClass2(int number) {
super(number);
}
}
public class SubClass3 extends SuperClass {
private int number;
public SubClass3(int number) {
super(number);
}
public int getNumber() {
number++;
return number;
}
public static void main(String[] args) {
SuperClass s1 = new SubClass1(20);
SuperClass s2 = new SubClass2(20);
SuperClass s3 = new SubClass3(20);
System.out.println(s1.getNumber());
System.out.println(s2.getNumber());
System.out.println(s3.getNumber());
//结论一:多态时,当子类覆盖了父类的方法,使用子类覆盖 的方法
//结论二:当子类覆盖父类的成员变量时,父类方法使用的是 父类的成员变量,子类方法使用的是子类的成员变量
}
}
执行输出:
21
21
1