JAVA动态绑定机制

article/2025/9/22 16:41:48

JAVA动态绑定机制(非常非常重要)

JAVA动态绑定机制动态绑定是与运行类型进行绑定

1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型(也就是与运行类型)绑定(意思就是如:有一个Cat类,Cat类中有一个cay方法,这个方法会和Cat类发生动态绑定)

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

在这里插入图片描述

package JAVA面向对象中级部分.encapsulationAndInherit.binding;public class DynamicBinding {public static void main(String[] args) {A a  = new B();//向上转型//当注释了B类中的sum()方法和sum1()方法结果变为了30和20System.out.println(a.sum());//40 --》30System.out.println(a.sum1());//30 --》20}
}class A{//父类public int i = 10;//由于调用方法时,方法会和该对象的内存地址(也就是运行类型)绑定//由于运行类型是B,所以查找是从B类方法开始查找,要因为B类中的getI()方法,直接返回属性i,属性没有动态绑定机制,因此直接返回20public int sum(){return getI()+10;}//方法是有动态绑定机制,所以查找时,先从子类B查找,由于B类没有sum1方法,//继承查找父类,父类有则调用sum1方法,要因为sum1方法返回是属性i,属性没有动态绑定机制直接返回i的值,所以是20public 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 sum1(){
//        return i+10;
//    }public int getI(){return i;}
}

多态应用

基本介绍:多态数组是数组定义类型为父类类型,里面保存的实际元素类型为子类类型

案例:

1.现有一个继承结构如下:要求创建一个Person对象,2个Student对象和2个Teacher对象,统一放在数组中。并调用msay方法。
2.应用实例升级,如何调用子类特有的方法,比如Teacher有一个teach,Student有一个study怎么调用?

在这里插入图片描述

package JAVA面向对象中级部分.encapsulationAndInherit.ployArray;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String say(){return "姓名:"+name+"\t年龄:"+age;}}package JAVA面向对象中级部分.encapsulationAndInherit.ployArray;public class Student extends  Person{private double score;public Student(String name,int age) {this.setName(name);this.setAge(age);}public Student(String name,int age,double score){//注意在构造器中使用super和this调用构造器完成初始化,两者只能出一个并且放在第一条语句super(name,age);
//        this(name,age);this.score =score;}public String say(){return super.say()+"\t成绩:"+score;}public void study(){System.out.println("学生:"+getName()+"正在学习JAVA课程!");}
}
package JAVA面向对象中级部分.encapsulationAndInherit.ployArray;public class Teacher extends  Person{private double salary;public Teacher(String name,int  age) {this.setName(name);this.setAge(age);}public Teacher(String name,int age,double salary){super(name,age);this.salary = salary;}public String say(){return super.say()+"\tsalary:"+salary;}public void teach(){System.out.println("老师:"+getName()+"正在教JAVA课程!");}
}package JAVA面向对象中级部分.encapsulationAndInherit.ployArray;public class PloyArray {public static void main(String[] args) {Person[] people = new Person[5];people[0] = new Person("海康",20);people[1] = new Student("湛江",18,99);people[2] = new Student("南宁",20,99.9);people[3] = new Teacher("西安",21,21688);people[4] = new Teacher("广州",22,22168);//循环遍历多态数组,调用sayfor (int i = 0; i < people.length; i++) {//person[i]编译类型是Person,运行类型是根据实际情况有JV来判断
//            System.out.println(people[i].say());//动态绑定机制if (people[i] instanceof Student){Student student = (Student) people[i];student.study();}else if (people[i] instanceof  Teacher){Teacher teacher = (Teacher) people[i];teacher.teach();}else {System.out.println(people[i].say());//在类型转换时,范围大的一定要放在后面,要不大的对小范围有接收作用}}}
}

多态参数问题

基本介绍:方法定义的形参类型为父类类型,实参类型允许为子类类型

应用实例1:前面的主人喂动物

应用实例2:

定义员工类Employee,包含姓名和月工资【prvate】,以及计算年工资getAnnual的方法。普通员工和经理继承了员工,经理类多了奖金bonus属性和管理manage方法,普通员工类多了work方法,普通员工和经理类要求分别重写getAnnual方法测试类中添加一个方法showEmpAnnal(Employee employee),实现获取任何员工对象的年工资,并在main方法中调用该方法【employee.getAnnual()】测试类中添加一个方法,testWork,如果是普通员工,则调用work方法,如果是经理,则调用manage方法package JAVA面向对象中级部分.encapsulationAndInherit.ployParameter;public class PloyParameter {public static void main(String[] args) {Worker worker = new Worker("海康", 18168);testWork(worker);double v = showEmpAnnual(worker);System.out.println(v);System.out.println("=================经理===============");Manager manager = new Manager("明天", 81688, 100000);testWork(manager);double v1 = showEmpAnnual(manager);System.out.println(v1);}public static double showEmpAnnual(Employee employee){return employee.getAnnual();}public static void testWork(Employee employee){if (employee instanceof Worker){Worker worker = (Worker) employee;worker.work();}else if (employee instanceof Manager){Manager manager = (Manager) employee;manager.manage();}else {System.out.println("您输入的类型有误!");}}
}
package JAVA面向对象中级部分.encapsulationAndInherit.ployParameter;public class Employee {private String name;private double salary;public Employee() {}public Employee(String name,double salary){this.name = name;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}//计算年工资getAnnual方法public double getAnnual(){return salary*12;}
}
package JAVA面向对象中级部分.encapsulationAndInherit.ployParameter;public class Worker  extends Employee{public Worker() {}public Worker(String name, double salary) {super(name, salary);}//普通员工work方法public void work(){System.out.println("普通员工打工干活");}public double getAnnual(){return getSalary()*12;}
}
package JAVA面向对象中级部分.encapsulationAndInherit.ployParameter;public class Manager extends Employee{private double bonus;public Manager(String name,double salary){super(name,salary);}public Manager(double bonus) {this.bonus = bonus;}public Manager(String name, double salary, double bonus) {super(name, salary);this.bonus = bonus;}//管理方法public void manage(){System.out.println("经理放屁了");}public double getAnnual(){return getSalary()*12 + bonus;}
}

http://chatgpt.dhexx.cn/article/8MolijKJ.shtml

相关文章

动态绑定多个值

React 属性展开 如果你已经有了一个 props 对象&#xff0c;你可以使用展开运算符 ... 来在 JSX 中传递整个 props 对象。以下两个组件是等价的&#xff1a; function App1() {return <Greeting firstName"Ben" lastName"Hector" />; }function App2…

Java的动态绑定和静态绑定

定义 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说&#xff0c;绑定分为静态绑定和动态绑定。 静态绑定&#xff1a;在程序执行前方法已经被绑定&#xff08;也就是说在编译过程中就已经知道这个方法到底是哪个类中的方法&#xff09;&#xff0c;此…

动态绑定属性

&#xff08;四&#xff09;动态绑定属性 4.1 v-bind的基本使用 ​ 某些时候我们并不想将变量放在标签内容中&#xff0c;像这样<h2>{{message}}</h2>是将变量h2标签括起来&#xff0c;类似js的innerHTML。但是我们期望将变量imgURL写在如下位置&#xff0c;想这…

C++ 动态绑定

定义 动态绑定是在运行期间发生的绑定&#xff0c;发生动态绑定的函数的运行版本由传入的实际参数类型决定&#xff0c;在运行时觉得函数的版本&#xff0c;所以动态绑定又称运行时绑定&#xff0c;动态绑定是C的多态实现的一种形式。 在C中&#xff0c;当使用基类的引用或指…

动态绑定配置

# 一、如何实现动态配置 在Spring体系下,如果实现了ConfigurationProperties则会自动刷新。而如果只使用Value的方法,要加上 RefreshScope 才能实现。 本篇文章我们来分别研究下他们的原理。然后在来看看其他的方案是如何做的吧。 # 二、实现原理 # 2.1 ConfigurationPropertie…

Java的静态绑定与动态绑定

我们可以对思考一个问题&#xff1a; JVM是如何知道调用的是哪个类的方法源代码&#xff1f; 这里面到底有什么内幕呢&#xff1f; 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 。 理解这两个绑定之前&#xff0c;我们不妨先理解一…

v-bind动态绑定

目录 一、 v-bind的基本使用 1. v-bind的基本使用 2. Class 与 Style 绑定 二、 v-bind动态绑定class 1. v-bind动态绑定class(对象语法) 2. v-bind动态绑定class(数组用法) 三、 v-for和v-bind结合 四、v-bind动态绑定style 1. v-bind动态绑定style(对象语法) 2. v…

Vue中动态绑定

目录 1. v-bind动态绑定class 1.1. v-bind动态绑定class(对象语法) 1.2. v-bind动态绑定class(数组用法) 2. v-for和v-bind结合 3. v-bind动态绑定style 3.1 v-bind动态绑定style(对象语法) 3.2 v-bind动态绑定style(数组语法) 1. v-bind动态绑定class 1.1. v-bind动态绑…

静态绑定与动态绑定

研究问题&#xff1a; https://www.cnblogs.com/ygj0930/p/6554103.html 要点&#xff1a; 一&#xff1a;绑定   把一个方法与其所在的类/对象 关联起来叫做方法的绑定。绑定分为静态绑定&#xff08;前期绑定&#xff09;和动态绑定&#xff08;后期绑定&#xff09;。 …

动态绑定

文章目录 动态绑定发生的条件在构造方法中调用重写的方法(一个坑) 动态绑定 动态绑定也叫运行时绑定&#xff0c;通俗的讲, 在Java中, 调用某 个类的方法,究竟执行了哪段代码(是父类方法的代码还 是子类方法的代码) , 要看究竟这个引用指向的是父类对 象还是子类对象. 这个过程…

动态绑定,多态(带你从本质了解多态)

在上一章节中&#xff0c;我们讲述了虚函数和虚函数表&#xff0c;我们知道了不管在类中有多少个虚函数&#xff0c;都不会使类的大小扩大&#xff0c;在this指针中&#xff0c;只会多出一个虚函数表的地址&#xff0c;是this指针的第一个内容&#xff0c;在虚函数表中&#xf…

数据结构——哈希表(Hash表)、哈希碰撞

1.概述 哈希表&#xff08;也叫散列表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;直接访问在内存存储位置的数据结构。就是一种以 键-值(key-value) 存储数据的结构&#xff0c;我们只要输入key&#xff0c;就可查找到其对应的值。 hash函数就是根据key计算…

24-哈希碰撞攻击是什么?

24-哈希碰撞攻击是什么&#xff1f; 最近哈希表碰撞攻击&#xff08;Hashtable collisions as DOS attack&#xff09;的话题不断被提起&#xff0c;各种语言纷纷中招。本文结合PHP内核源码&#xff0c;聊一聊这种攻击的原理及实现。 哈希表碰撞攻击的基本原理 哈希表是一种…

hashcode及哈希碰撞

数据结构中&#xff1a; 用来映射元素关键字(能唯一标识该元素&#xff0c;类似数据库中的主键可以唯一标识一条记录)和元素的内存地址的关系(解决树&#xff0c;线程表等结构中元素和位置无确定关系&#xff0c;查找时需要进行不断比较的问题。顺序查找的比较结果是和不等。树…

hash和hash碰撞以及解决方案

hash&#xff1a; Hash&#xff0c;一般翻译做“散列”&#xff0c;也有直接音译为“哈希”的&#xff0c;就是把任意长度的输入&#xff08;又叫做预映射&#xff0c; pre-image&#xff09;&#xff0c;通过散列算法&#xff0c;变换成固定长度的输出&#xff0c;该输出就是…

哈希碰撞攻击与防范机制

1.引子 哈希表的原理是用数组来保存键值对&#xff0c;键值对存放的位置&#xff08;下标&#xff09;由键的哈希值决定&#xff0c;键的哈希值可以在参数时间内计算出来&#xff0c;这样哈希表插入、查找和删除的时间复杂度为O(1)&#xff0c;但是这是理想的情况下&#xff0…

HashMap的实现原理及hash冲突(碰撞)解决方法

HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。当程序执行 map.put(String,Obect)方法 时&#xff0c;系统将调用String的 hashCode() 方法得到其 hashCode 值——每个 Java 对象都有 hashCode() 方法&#xff0c;都可通过该方法获得它的 hashCode 值。得到这…

解决Hash碰撞冲突方法总结

Hash碰撞冲突 我们知道&#xff0c;对象Hash的前提是实现equals()和hashCode()两个方法&#xff0c;那么HashCode()的作用就是保证对象返回唯一hash值&#xff0c;但当两个对象计算值一样时&#xff0c;这就发生了碰撞冲突。如下将介绍如何处理冲突&#xff0c;当然其前提是一…

哈希表碰撞攻击的基本原理

原文地址&#xff1a;http://blog.jobbole.com/11516/ 来源&#xff1a;张洋 最近哈希表碰撞攻击&#xff08;Hashtable collisions as DOS attack&#xff09;的话题不断被提起&#xff0c;各种语言纷纷中招。本文结合PHP内核源码&#xff0c;聊一聊这种攻击的原理及实现。 …

hash碰撞处理方法

目录 哈希表 哈希冲突 解决碰撞方法 1、开放定址法 a)、线性探测法 a)、二次探测法 c&#xff09;伪随机探测 2、再哈希法 3、拉链法 4、建立公共溢出区 哈希表 是一种实现关联数组抽象数据类型的数据结构&#xff0c;这种结构可以将关键码映射到给定值。 简单来说…