首页 > 编程语言 >java细节篇之动态绑定机制

java细节篇之动态绑定机制

时间:2024-03-20 21:30:22浏览次数:27  
标签:java 子类 代码 绑定 Dog 细节 Animal 动态

大家好,我是教授.F

动态绑定机制,在对象上体现。

一个对象有编译类型和运行类型,运行类型看 = 号的右边,编译类型看 = 号的左边。

例如:

public Test{
    public static void main(String[] args){
        Animal animal = new Dog();
    }
}
class Aniaml{
}
class Dog extends Animal{
}

这时编译类型为Animal,运行类型为Dog。

这时要注意了,这个animal能调用什么方法要看Animal中有什么方法,Animal有什么方法才能调用什么方法,这时在编译期间的,也就是你写完后,仅仅只能证明语句不会报错。那在运行期间,animal是要跑到Dog中看看是否有你写的那些方法,如果没有,程序还是不能正常执行,如果有,则只会调用Dog中的成员。

那这有什么用?不纯纯的浪费时间吗?

其实不会的。如果现在有一个需求:父类是Animal,子类是Dog和Cat。如何完成堆Dog和Cat的喂养呢?这里就可以使用动态绑定机制。在父类中写了eat()的方法,然后Dog和Cat重写父类的eat()方法。如下面样式:

class Animal{
    public void eat(){
    }
}
class Dog extends Animal{
    @Override
    public void eat(){
    System.out.println("喂狗");
    }
}
class Cat extends Animal{
    @Override
    public void eat(){
    System.out.println("喂猫");
    }
}

当在main中写Animal animal1 = new Dog();和Animal animal2 = new Dog();时,输出的分别就是喂狗和喂猫了。

虽然直接使用Cat类和Dog类就能直接进行操作,但是在项目中,可能会造成一下问题:

  1. 耦合性高: 直接使用Cat和Dog类,如果后期需要引入更多的动物类,或者对原有类进行修改,可能会导致代码的耦合度增加,使得代码难以维护和扩展。

  2. 可扩展性差: 如果在代码中直接使用具体的子类,将限制您的代码在未来进行扩展的能力。通过动态绑定,您可以更容易地添加新的子类,而不需要修改现有的代码。

  3. 违反面向对象设计原则: 面向对象设计原则中的开闭原则告诉我们应该对扩展开放,对修改关闭。直接调用具体子类的方法可能会违反这一原则,而使用动态绑定则符合该原则。

动态绑定的好处包括:

  1. 多态性: 动态绑定实现了多态性,使得同一个方法调用根据不同的对象类型而表现出不同的行为,从而提高代码的灵活性。

  2. 简化代码: 动态绑定减少了代码中的条件判断和分支语句,使代码结构更加清晰简洁,易于理解和维护。

  3. 提高可扩展性: 使用动态绑定,您可以更轻松地添加新的子类并重写父类方法,而不需要修改现有的代码,从而提高代码的可扩展性。

  4. 代码复用: 动态绑定使得父类中定义的方法可以被多个子类重写并复用,减少了代码的重复编写。

因此,通过使用动态绑定,您可以更好地遵循面向对象设计原则,使代码更具扩展性、灵活性和可维护性。

注意:

  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  2. 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用

标签:java,子类,代码,绑定,Dog,细节,Animal,动态
From: https://blog.csdn.net/FZYjiaoshou/article/details/135889251

相关文章

  • Java递归删除文件夹
    importjava.io.File;importjava.util.Scanner;publicclassDemo{publicstaticvoidmain(String[]args){FiledirFile=getDirFile();delDirFiles(dirFile);}/***递归删除文件夹里所有文件*/privatestaticvoi......
  • Java递归计算一个文件夹所有文件大小
    importjava.io.File;importjava.util.Scanner;publicclassDemo1{publicstaticvoidmain(String[]args){FiledirFile=getDirFile();System.out.println(countDirFile(dirFile));}/***计算文件夹大小*/public......
  • java毕业设计基于微信小程序的中药调理系统
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义随着现代生活节奏的加快,人们对于健康问题越来越关注。在众多保健方式中,中药以其独特的调理作用和较少的副作用受到广泛欢迎。然而,中药的种类繁多,配方复杂,普通人往......
  • 归并排序算法 java实现
    publicstaticvoidmain(String[]args){int[]arr={9,5,7,3,1,6,8,4,2};mergeSort(arr,0,arr.length-1);}/***归并排序*注意:归并的拆分数组和合并数组是从左到右依次进行的,网上很多文章都是错误的*并不是左右一起拆分,网上很多文章都是这样的......
  • Java中String类型的创建与比较(详解)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、String类型是什么??二、String类型的创建使用字符串字面量使用new关键字intern()方法简读图解String的比较总结前言提示:这里可以添加本文要记录的大概内容:在背八股文(Holis版)的过程中遇......
  • Java 越来越卷,掌握哪些知识才有机会进大厂?来看各个大厂AI 大模型怎么说?
    通义千问(阿里)在当前竞争激烈的Java开发市场中,为了增加进大厂和获得更好职业发展的机会,Java开发者应关注以下几个核心知识点与技能:基础扎实:•熟练掌握Java基础语法、面向对象设计原则、集合框架、多线程并发编程、异常处理机制等基础知识。•对JVM内存模型、垃圾回......
  • java基础的项目
    334,零钱通   思路:(1)先完成显示菜单,并可以选择菜单,给出对应提示(2)完成零钱通明细,简单的话可以使用String拼接(3)完成收益入账  完成功能驱动程序员增加新的变化和代码(4)消费(5)退出(6)用户输入4退出时,给出提示"你确定要退出吗?y/n",必须输入正确的y/n,否则循环输入指令,直到......
  • (day 13)JavaScript学习笔记(对象1)
    概述        这是我的学习笔记,记录了JavaScript的学习过程。在写博客的时候我会尽量详尽的记录每个知识点。如果你完全没接触过JavaScript,那么这一系列的学习笔记可能会对你有所帮助。    今天学习对象,主要是创建对象、对象属性、省略key、遍历对象属性、删......
  • JavaScript中的“==“和“===“运算符的区别
    JavaScript中的比较运算符"=="和"==="用于比较两个值是否相等。尽管它们的目的相同,但它们在比较过程中采用了不同的策略1.“==”相等运算符:"=="运算符执行一种松散相等比较,它在比较之前会进行类型转换。如果进行比较的两个值类型不同,JavaScript会尝试将它们......
  • x == (x = y) 与 (x = y) == x 不同?【Java 面试题】
    x==(x=y)与(x=y)==x不同?classQuirky{publicstaticvoidmain(String[]args){intx=1;inty=3;System.out.println(x==(x=y));//falsex=1;//resetSystem.out.println((x=y)==x);//......