• 关于 java 的动态绑定机制


    聊一聊动态绑定机制, 相信看完这篇文章,你会对动态绑定机制有所了解。

    网上大多一言概括:

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

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

    这里我们展开来说一说。

    动态绑定机制,简单来说,就是在以父类为编译类型,创建子类对象的时候,绑定子类运行类型,当我们再调用方法的时候,能够有序的寻找方法,实现方法的有序调用。

    动态绑定机制会出现在多态中,多态是 Java 的重要的三个属性之一,动态绑定机制就是建立在,封装,多态,继承的基础上延伸出的。

    要了解动态绑定机制,首相要把对象的多态与继承搞明白,还有编译类型,运行类型,这是前提。网上都有详细的讲解,这里不做延伸。

    废话不多书,直接上代码演示讲解,详细的讲解会在代码的注释当中。

    首先我们要 创建父类 Person 类

    //创建父类
    public class Person {
        //简单的创建两个属性
        private String name;
        private int age;
    
        //创建行为方法,方法中调用创建的say方法
        public void haviours(){
            say();
        }
        //创建方法
        public void say(){
            System.out.println("我是人类!!!");
        }
    
    }

    创建子类 Student

    //创建子类
    public class Student extends Person {
        //创建学生的属性
        private int  score;
        //重写行为
        public void haviours(){
            say();
        }
        //重写say方法
        public void say(){
            System.out.println("我是学生!!!");
        }
    }

    首先我们对 say 方法进行调用。

    public class Demo01 {
        public static void main(String[] args) {
            //创建学生
            Person student = new Student();
            //调用学生的say()方法,由于我们的编译类型是Person类,而运行类型是Student类,而动态绑定机制是绑定运行类型。
            //所以,当我们调用say()方法时,是调用Student类的say()方法
            student.say();//返回“我是学生”
            //、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
            //如果我们将student类的say()方法注销,他寻找student类的say方法无果后,会再向它的父类调用say方法。返回我是人类,效果等同于
    
        }
    }

    但是,重点来了。。。。。。。。。。。。

    如果我们调用的是 haviours 方法,那么他的方法是调用什么呢

    public class Demo02 {
        public static void main(String[] args) {
            //创建学生
            Person student = new Student();
            //调用学生的haviours方法,由于我们的编译类型是Person类,而运行类型是Student类,而动态绑定机制是绑定运行类型。
            //所以,当我们调用haviours()方法时,该对象绑定的是Student类,所以是调用Student类的say()方法
            student.haviours();//返回我是学生!!!
        }
    }

    但是,还有人可能会有疑问,如果 Student 类中的 havious 方法被注释掉呢,你是不是会想。子类 Student 中没有 havious 方法,调用父类的 havious 方法,然后 havious 调用父类的 say 方法???

    抱歉了,他调用的是子类 Student 的 Say 方法

    public class Demo03 {
        public static void main(String[] args) {
            //创建学生
            Person student = new Student();
            //调用学生的haviours方法,由于我们的编译类型是Person类,而运行类型是Student类,而动态绑定机制是绑定运行类型。
            //所以,当我们调用haviours()方法时,由于子类没有havious方法,调用父类的havious方法,在父类的havious中,调用say方法,这时,动态绑定机制是绑定运行类型。该对象绑定的是Student类,所以是调用Student类的say()方法
            student.haviours();//返回我是学生!!!
        }
    }

    介绍完动态邦迪机制对方法的绑定,接下来说一说对属性的影响。

    当调用对象的属性时,没有动态绑定机制,哪里声明就使用哪里。这句话十分容易理解。

    也就是动态绑定机制对属性没有影响,放心调用。

    动态绑定机制(完)。

    结语:由于在网上查找相关的动态绑定机制时,看到没有动态绑定的详细讲解,而这也是一个小难点,所以翻阅书籍,进行了学习,并进行总结,世界上本没有路,走的人多了,也便有了路。

    欢迎大家关注公众号「马小乐学技术」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考、面经资料等等,同时欢迎大家加我微信「sy200316x」一起交流学习 

  • 相关阅读:
    VBA读取网络划分的数据
    短剧是什么?短剧平台的经营模式。短剧平台需要什么资质?
    linux系统修改网卡名称
    OpenHarmony实战开发-Web自定义长按菜单案例。
    插卡4G工业路由器充电桩智能柜专网视频监控4G转以太网转WiFi有线网速测试 软硬件定制
    搭建docker镜像仓库(二):使用harbor搭建本地镜像仓库
    c语言tips-带参main函数
    被妖魔化的奥数,到底该怎么学?
    掌动智能浅析Web自动化测试的重要性
    【红队】ATT&CK - Active Scanning(主动扫描)
  • 原文地址:https://blog.csdn.net/YYniannian/article/details/126222600