Java的动态绑定机制

动态绑定机制

内容:

  1. 当调用对象方法时, 该方法会与该对象的内存地址/运行类型绑定
  2. 当调用对象属性时, 没有动态绑定机制, 哪里声明, 哪里使用, 也就是遵循就近原则

例子

我们先给出两个类, 类A作为父类, 类B作为A的子类, 两者的属性和方法完全一致

class A { // 父类
    public int i = 10;

    public int sum() {
        return getI() + 10;
    }
    public int sum1() {
        return i + 10;
    }
    public int getI() {
        return i;
    }
}

class B extends A {
    public int i = 20;
    public int sum() {
        return i + 20;
    }
    public int getI() {
        return i;
    }
    public int sum1() {
        return i + 10;
    }
}

紧接着在main方法中如下

public static void main(String[] args) {
        A a = new B();
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }

首先这就是一个经典的多态向上转型, 根据多态的规则, 方法看运行类型, 属性看编译类型
a的编译类型为A, 运行类型为B
所以这里可以知道第一个答案为40, 第二个答案为30


接下来是重点

1, 将B类中的方法sum() 删除, 那么a.sum()返回什么?

这里我们再来分析一下, 首先调用a的sum方法, 因为运行类型是B,所以在B中寻找, 发现没有, 于是寻找父类
发现父类中有sum()

 public int sum() {
    return getI() + 10;
}

但是问题就出现了, 父类的sum()中含有的getI() 应该属于谁?
这里因为java的动态绑定机制, 我们才知道, 这里遇到了新的方法应该返回B中寻找, 发现有getI()
所以这里返回的应该是B类中的i, 所以答案为30

2.将B类中的方法sum1() 删除, 那么a.sum1()返回什么?

依旧按照上述分析方法, 这里会去A中寻找sum1()方法

 public int sum1() {
    return i + 10;
}

这里仍然有相同的问题, 这里有一个i, 应该属于谁?
根据开篇的第二条, 属性没有动态绑定机制, 所以遵循就近原则, 所以这里是A的i
答案是20

posted @   Xingon2356  阅读(17)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示