java变量覆盖问题

背景

有一道笔试题,java子类和父类定义相同的变量。在父类引用指向子类实例后,父类引用访问变量,具体应该访问哪个变量?子类定义的,还是父类定义的。(答案应该是父类定义的,具体看下面代码测试结果)

结论

父类引用指向子类实例。

    1. 通过父类引用进行访问「成员变量」和「静态变量」的时候,都会访问父类的变量
    1. 父类引用访问被重写的方法的时候,会调用「子类重写的方法」。如果是访问静态方法则不一样,因为静态方法不允许被重写,因此访问「父类的静态方法」。
**
 * 结论:
 * 父类引用指向子类实例。 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");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值