Java多态 动态绑定机制

属性看编译类型,(能调用的)方法看运行类型

就是说你可以用哪些成员是由编译类型决定的,但在调用方法时会基于你创建的对象空间进行层级查找调用

(重点看最后一行代码)上面的例子就好像有种骗过编译器的感觉?对的,如果子类中没有override函数,那么最后一行是会报错的哦;现在有override,就好像编译器以为你写下这段代码会跑父类中的这个方法,可是你和jvm串通好啦,我们要运行子类里重写的方法

我们这里变式一下:

始终牢记:调用方法时看的是运行类型(看究竟哪个对象空间嘛)

下面这个子类中也有geti()所以会优先执行它,而sum()没有被重写,只能老老实实执行父类的

class Father {
    public int i = 10;
    public int sum() {
        return geti() + 10;
    }
    public int geti() {
        return i;
    }
}

class Son extends Father {
    public int i = 18;
    public int geti() {
        return i;
    }
}

class Main {
    public static void main(String[] args) {
        Father test = new Son();
        System.out.println(test.sum());  // 28
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值