java动态绑定机制

本文通过一个Java代码示例,解释了动态绑定的概念。当子类对象调用方法时,即使方法在父类中定义,也会根据运行时的对象类型(即B类)来执行相应的方法。即使注释掉B类的sum和sum1方法,也会调用父类A中的实现,遵循方法的动态绑定机制。属性访问则遵循静态绑定,直接根据编译类型(A类)访问成员。因此,getI()返回20,sum()返回30,sum1()返回20。

原理:(1)、当调用方法时,方法会跟对象的运行类型绑定。
(2)、当调用属性时,没有对象绑定机制,哪里声明哪里使用。

package com.hb.poly_;
public class DynamicBinding {
    public static void main(String[] args) {
        A a=new B();
        System.out.println(a.i);
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }
}
class A{
    public int i=10;
    public int getI(){
        return i;
    }
    public int sum(){
        return getI()+10;
    }
    public int sum1(){
        return i+10;
    }
}
class B extends A{
    public int i=20;
    public int getI(){
        return i;
    }
    public int sum(){
        return i+20;
    }
    public int sum1(){
        return i+10;
    }
}

以上代码答案很简单,编译类型是A,属性与编译类型有关,运行类型是B,所以从B类开始查找方法。
在这里插入图片描述
如果我把B类的sum和sum1方法注释掉会答案会是怎么样呢?

package com.hb.poly_;
public class DynamicBinding {
    public static void main(String[] args) {
        A a=new B();
        System.out.println(a.i);
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }
}
class A{
    public int i=10;
    public int getI(){
        return i;
    }
    public int sum(){
        return getI()+10;
    }
    public int sum1(){
        return i+10;
    }
}
class B extends A{
    public int i=20;
    public int getI(){
        return i;
    }
    /*public int sum(){
        return i+20;
    }
    public int sum1(){
        return i+10;
    }*/
}

因为运行类型是B,所以根据继承机制,我们先从B类查找方法sum和sum1,但是都被注释掉了,所以查找父类A,父类A的sum方法内有函数getI(),A类和B类也都定义了这个函数,那么该调用哪个函数呢?sum1方法内有个i,是A类的i还是B类的i呢?
这就得用到java的动态绑定机制了,方法会与运行类型绑定,所以调用的是B类中的getI函数,属性则是没有动态绑定机制,哪里声明哪里使用,getI()返回20,sum()返回30,sum1()返回20。
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值