Java中的动态绑定机制

 更新时间:2023年06月06日 09:23:50   作者:昱晟168  
这篇文章主要介绍了Java中的动态绑定机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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和20
        System.out.println(a.sum());//40 --》30
        System.out.println(a.sum1());//30 --》20
    }
}
class A{//父类
    public int i = 10;
    //由于调用方法时,方法会和该对象的内存地址(也就是运行类型)绑定
    //由于运行类型是B,所以查找是从B类方法开始查找,要因为B类中的getI()方法,直接返回属性i,属性没有动态绑定机制,因此直接返回20
    public int sum(){
        return getI()+10;
    }
    //方法是有动态绑定机制,所以查找时,先从子类B查找,由于B类没有sum1方法,
    //继承查找父类,父类有则调用sum1方法,要因为sum1方法返回是属性i,属性没有动态绑定机制直接返回i的值,所以是20
    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 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);
        //循环遍历多态数组,调用say
        for (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;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java警告:源发行版17 需要目标发行版17问题及解决

    java警告:源发行版17 需要目标发行版17问题及解决

    文章介绍了如何解决项目JDK版本不一致的问题,包括修改Project Structure、Modules、Dependencies和Settings中的JDK版本,以及在pom.xml中指定JDK源版本
    2024-11-11
  • MybatisPlus逆向工程的项目实践

    MybatisPlus逆向工程的项目实践

    Mybatis-Plus逆向工程,是MP官方提供的一款代码生成器,可以自动生成对应的实体类、Mapper接口和配置文件,,本文主要介绍了MybatisPlus逆向工程的项目实践,感兴趣的可以了解一下
    2024-03-03
  • SpringCloud Zuul过滤器和谷歌Gauva实现限流

    SpringCloud Zuul过滤器和谷歌Gauva实现限流

    这篇文章主要介绍了SpringCloud Zuul过滤器和谷歌Gauva实现限流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • springboot @ComponentScan注解原理解析

    springboot @ComponentScan注解原理解析

    这篇文章主要介绍了springboot @ComponentScan注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • EasyExcel读写、模板填充、Web上传下载入门到实战全指南

    EasyExcel读写、模板填充、Web上传下载入门到实战全指南

    EasyExcel类是一套基于Java的开源Excel解析工具类,相较于传统的框架如Apache poi、jxl等更加快速、简洁,还可以解决大文件内存溢出问题,这篇文章主要介绍了EasyExcel读写、模板填充、Web上传下载入门到实战的相关资料,需要的朋友可以参考下
    2026-01-01
  • 如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

    如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

    这篇文章主要介绍了如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SDK进行车牌识别和图片抓拍的开发流程,包括遇到的问题及其解决办法,需要的朋友可以参考下
    2025-02-02
  • SpringBoot 热搜与不雅文字过滤的实现

    SpringBoot 热搜与不雅文字过滤的实现

    本文主要介绍了SpringBoot 热搜与不雅文字过滤的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 基于Java代码操作Redis过程详解

    基于Java代码操作Redis过程详解

    这篇文章主要介绍了基于Java代码操作Redis过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • HttpClient实现文件上传功能

    HttpClient实现文件上传功能

    这篇文章主要为大家详细介绍了利用HttpClient实现文件上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • SpringMVC 方法四种类型返回值总结(你用过几种)

    SpringMVC 方法四种类型返回值总结(你用过几种)

    这篇文章主要介绍了SpringMVC 方法四种类型返回值总结(你用过几种),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05

最新评论