背景
有一道笔试题,java子类和父类定义相同的变量。在父类引用指向子类实例后,父类引用访问变量,具体应该访问哪个变量?子类定义的,还是父类定义的。(答案应该是父类定义的,具体看下面代码测试结果)
结论
父类引用指向子类实例。
-
- 通过父类引用进行访问「成员变量」和「静态变量」的时候,都会访问父类的变量
-
- 父类引用访问被重写的方法的时候,会调用「子类重写的方法」。如果是访问静态方法则不一样,因为静态方法不允许被重写,因此访问「父类的静态方法」。
**
* 结论:
* 父类引用指向子类实例。 Base who = new Sub();
* 1. 通过父类引用进行访问「成员变量」和「静态变量」的时候,都会访问父类的变量
* 2. 父类引用访问被重写的方法的时候,会调用子类重写的方法。因为静态方法不允许被重写,因此访问静态方法的时候还是访问父类的方法
*/
public class Main {
public static void main(String[] args) {
Base who = new Sub();
System.out.println("who.var=" + who.var);
System.out.println("who.staticVar=" + who.staticVar);
who.method();
who.staticMethod();
}
static class Base {
public int var = 0;
public static int staticVar = 0;
public static void staticMethod() {
System.out.println("Base static method");
}
public void method() {
System.out.println("Base method");
}
}
static class Sub extends Base {
public int var = 1; // 实例变量
public static int staticVar = 1; // 静态变量
public static void staticMethod() { // 覆盖静态方法
System.out.println("Sub static method");
}
@Override
public void method() { // 重写实例方法
System.out.println("Sub method");
}
}
}