首页 > 编程语言 >Java(1)-粗解动态绑定

Java(1)-粗解动态绑定

时间:2024-04-27 20:01:11浏览次数:23  
标签:调用 Java 绑定 粗解 动态 方法 speak

Java的动态绑定机制是OOP中一个非常核心的概念。要理解动态绑定需要从Java的对象和类说起。
当我们在创建一个类的时候,实际上就是在定义一种新的数据类型。类中可以包含属性和方法,基于这个类创建一个对象的时候,这个对象就有拥有该类所有的属性和方法。
在引出动态绑定的概念之前,可以先讲一个比喻:
想象一下,你是一个餐厅的老板,有一个菜单(),上面有各种菜品的名称(方法名),这个菜单是给客人(程序)看的,客人可以根据菜单点菜(调用方法)。在你餐厅中,有几位不同的厨师(对象),他们各自擅长不同类型的菜品,比如专门做西餐的、专门做中餐的等等。
当客人点了一个菜时(在代码中调用一个方法时),虽然菜单上的菜名(方法名)是一样的,比如“特色炒面”,但实际上根据不同厨师的专长,这道菜的做法和口味可能会有很大的不同(不同对象的同名方法可能有不同的实现)。客人点菜的时候并不需要指定哪个厨师来做这道菜,他们只需要知道菜名。
在你的餐厅里(在程序运行时),根据厨师的不同,点同一个名字的菜可能得到完全不同的结果。这就是动态绑定的本质:直到客人点菜(直到程序运行到那一点),你才决定由哪个厨师来烹饪(由哪个对象的哪个具体实现来执行方法)。也就是说,虽然编译器在编译程序时知道有一个叫“特色炒面”的菜(一个叫做某方法的接口),但具体由哪个厨师做这道菜,只有在实际运行时才能确定。
这种机制使得你的餐厅(程序)非常灵活,能够应对不同客人的口味偏好(不同的使用场景),而且你可以随时增加新的厨师(添加新的类和方法实现),不需要改动菜单(不需要修改现有代码)。
这个例子还是很清晰生动的,可以对动态绑定有个初步的认识。

什么是动态绑定

动态绑定(也称为晚期绑定)是一种在运行时(而非编译时)确定对象方法调用所对应的代码的机制。这意味着 Java 运行时会根据对象的实际类型来决定应该调用哪个方法,即使这个调用是通过一个引用变量发生的,该变量的类型可能是当前对象类型的任何父类。

动态绑定的简单实现

动态绑定的工作原理主要是通过方法重写实现的。
举个例子:

// 父类  
class Animal{  
    public void speak(){  
        System.out.println("动物发出声音");  
    }  
}  
// 子类1  
class Dog extends Animal{  
    @Override  
    public void speak(){  
        System.out.println("狗发出声音");  
    }  
}  
// 子类2  
class Cat extends Animal{  
    @Override  
    public void speak(){  
        System.out.println("猫发出声音");  
    }  
}  
public class AnimalTest {  
    public static void main(String[] args) {  
        Animal animal = new Dog();  
        animal.speak();  
        animal = new Cat();  
        animal.speak();  
    }  
}

例子输出:

狗发出声音
猫发出声音

在例子中,当调用 myAnimal.speak() 时,尽管 myAnimal 的类型是 Animal,但由于它实际指向 Dog 的一个实例,所以调用的是 Dog 类的 speak 方法。同样,接下来它指向 Cat 的一个实例,所以调用的是 Cat 类的 speak 方法。

动态绑定的好处

根据例子可以看出来,我们可以新增其他的子类并重写父类的方法,程序其他部分都不用任何修改就可以继续使用。

动态绑定细节

细究一下Java的动态绑定机制(非常重要)_基于运行时的动态绑定-CSDN博客
以上博客讲得很细致,就不班门弄斧了

标签:调用,Java,绑定,粗解,动态,方法,speak
From: https://www.cnblogs.com/marigo/p/18162423

相关文章

  • Java(2)-粗解类加载器
    Java的类加载器是Java运行时环境中的重要组件,核心功能是将类的字节码加载到Java虚拟机中。举个例子可以通过一个图书馆的比喻来形象地解释类加载器的作用、用法和使用场景。想象一下,有一个巨大的图书馆(JVM),其中有非常多的藏书(类)。当你(程序)需要阅读一本书(使用一个类)时,你首先需要......
  • 学习笔记-Java内存区域
    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来。运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间。有的区域随着虚拟机进程启动一直......
  • 【Java】java1.8安装教程及java环境配置
    一、下载JDK源文件1、根据自己系统,下载对应的文件下载地址:Java存档下载-JavaSE8u211及更高版本|Oracle中国 2、下载后,可将安装包移动到自定义目录中,然后双击文件进行安装操作 二、安装1、双击安装文件,根据安装向导指引,点击下一步,进行安装 2、点击下一步后,根......
  • java发送http请求
    privatevoidhandleCartItems(List<CartVO>vos){//1.获取商品idSet<Long>itemIds=vos.stream().map(CartVO::getItemId).collect(Collectors.toSet());//2.查询商品ResponseEntity<List<ItemDTO>>response......
  • 在JavaScript中,DOM对象与jQuery对象的区别与转换
    Dom原生对象和jQuery对象的区别:jQuery选择器得到的jQuery对象和标准的js中的document.getElementById()取得的dom对象是两种不同类型,两者不等价。注:js原生获取的dom是一个对象;jQuery对象就是一个数组对象。JQuery无法使用DOM对象的任何方法,同样的DOM对象也不能使用JQuery里......
  • Java读取网址信息
    Java读取网址信息今天的需求是根据接口获取JSON数据并存入,之前只会前端用Ajax或者Axios去处理显示出来没想过后端也要拿,没有思路于是查找,发现都是基础以前用的还是太少了,特此总结,后续有需要再补充。1.读取get请求,无需参数publicstaticStringget(StringurlStr){//......
  • 微服务想缓存一些数据,不希望重复调用。java SoftReference软引用存储缓存
    背景:微服务我们要调用字典数据,但是很多都是要重复调用的,没有缓存,我为了设置一个应用的缓存,并且可以定时清理,更新 首先定义两个静态数据,。一个软连接缓存,一个定时清理线程privatestaticSoftReference<Map<String,Map<String,DictionaryVo>>>plmDicMapCache=newSoftR......
  • Java面向对象03——三大特性之继承
    一、继承(extends)1.1、继承是什么继承就是Java允许我们用extends关键字,让一个类与另一个类建立起一种父子关系;被继承的类称为父类(基类、超类),继承父类的类都称为子类(派生类) ,当子类继承父类后,就可以直接使用父类公共的属性和方法了当子类继承父类后,就可以直接使用父类公共的......
  • kali 设置 Java 版本,并更换为 1.8 版本
    kali设置Java版本,并更换为1.8版本1.安装JDK1.下载java1.8:https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz2.建立目录,将下载的jdk的安装包复制过去并进行解压sudomkdir-p/usr/local/javacpjdk-8u202-linux-x64.tar.gz/usr/l......
  • openharmony 多线程的方式有哪些?两个worker线程数据如何通讯、内存如何共享、与Java多
    OpenHarmony操作系统支持多种多线程并发处理策略,以提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰。以下是OpenHarmony中的多线程方式,以及Worker线程间的数据通讯和内存共享方法,还有它们与Java多线程的区别:OpenHarmony多线程方式Worker线程:OpenHarmony中的Worker是......