当前位置: 首页 > article >正文

动态绑定机制

1.是什么

        Java 动态绑定(Dynamic Binding)是指程序在运行时,根据对象的实际类型来决定调用哪个方法的过程。这是面向对象编程中的一个核心概念,也是多态性得以实现的基础。

动态绑定的概念:

  1. 编译时绑定:在编译时,编译器会根据对象的声明类型来决定调用哪个方法。如果对象的声明类型是父类,那么编译器会调用父类中定义的方法。

  2. 运行时绑定:在运行时,JVM 会根据对象的实际类型来决定调用哪个方法。如果对象的实际类型是子类,那么会调用子类中重写的方法。

动态绑定的条件:

  • 继承:动态绑定通常发生在继承关系中,子类继承父类的方法。
  • 方法重写:子类重写父类的方法。
  • 父类引用指向子类对象:使用父类的引用类型变量来引用子类的对象。

总结:

1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定

2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用


例题1:(问输出结果是什么?)

public class A {
    public int i = 10;

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

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

    public int get() {
        return i;
    }
}

class B extends A {
    public int i = 20;

    public int sum() {
        return i + 20;
    }

    public int get() {
        return i;
    }

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

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

}

 答案:

40
30

解释:A a = new B();向上转型,所以a指向的对象是B,a调用子类B中的方法


例题2:更改一下(将子类的sum和sum1方法都移除,那么现在的输出结果是什么呢?)

public class A {
    public int i = 10;

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

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

    public int get() {
        return i;
    }
}

class B extends A {
    public int i = 20;

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

}

解释A a = new B();向上转型,a调用sum方法,先看子类B,因为子类B类没有sum方法所以调用父类A的sum方法,在sum方法中,return 返回的是get()方法,那么调用的是父类的get还是子类的get方法呢?

根据总结:当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定,所以先看子类B有没有get方法,有则调用,无则调用父类的方法,因为子类有那么调用子类的get方法,子类的get方法返回的是i属性,又根据总结:当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用,所以i=20,最后返回结果i+10=30

同理可得a调用sum1方法得到结果为20

答案:

30
20

http://www.kler.cn/news/331967.html

相关文章:

  • 【Matlab绘图】从Excel导入表格并进行三维绘图
  • STM32F407之SPI
  • java基础知识汇总
  • 网络编程篇:UDP协议
  • Linux 进程状态、僵尸进程与孤儿进程
  • 在阿里工作是一种什么体验?
  • HBase 的二级索引和配置实现
  • JVM内存回收机制
  • [大语言模型-论文精读] 利用多样性进行大型语言模型预训练中重要数据的选择
  • 损失函数篇 | YOLOv10 更换损失函数之 MPDIoU | 《2023 一种用于高效准确的边界框回归的损失函数》
  • Spring Boot 应用Kafka讲解和案例示范
  • 职业技术学校开设无人机培训技术详解
  • ultralytics-yolo-webui :Detect 目标检测 工具-先行版本 >> DataBall
  • scrapy爬取汽车、车评数据【中】
  • 回归预测 | Matlab基于POA-SVR鹈鹕算法优化支持向量机的数据多输入单输出回归预测
  • 基于多维统计分析与GMM聚类的食品营养特征研究
  • Chainlit集成LlamaIndex并使用通义千问实现和数据库交互的网页对话应用(text2sql)
  • 关于Mac管理员root权限的一些问题总结
  • Android 简单实现联系人列表+字母索引联动效果
  • VUE 开发——Node.js学习(一)