首页 > 编程语言 >Java基础第八章(多态)

Java基础第八章(多态)

时间:2024-10-07 16:48:54浏览次数:11  
标签:调用 Java 对象 子类 多态 第八章 Cat 类型 方法

多态

1.方法体现多态

方法重载体现多态

对象通过传入不同数量的参数,会调用不同的sun方法,体现出多态

方法重写体现多态

A类和B类是继承关系,通过不同对象调用对应类中重写的方法体现

2.对象体现多态

编译是javac,运行是java

(1)一个对象的编译类型和运行类型可以不一致

将父类的一个引用指向子类的一个对象(等号右边是新建对象,左边只是引用,使animal指向对象),animal的编译类型是Animal,运行类型是Dog。言外之意是父类的引用可以接收一个子类的对象

此时animal编译类型和运行类型一致,都是Animal

(2)编译类型在定义对象时就确定了,不能改变

上述例子中animal的编译类型就是Animal,不能再改变

(3)运行类型可以改变

(4)编译类型看等号的左边,运行类型看等号的右边

运行到调用cry方法时,看此时对象animal的运行类型是什么,此时运行类型是Dog,那么调用的就是Dog类中的cry方法;当animal的运行类型是Cat时,那么调用的就是Cat类中的cry方法

理解!

方法形参列表中是Animail animal,是父类的引用,可以接收子类的对象

多态的细节(向上转型)

多态的情况下,子类重写了父类的方法,对象调用该方法时,访问的是子类的重写方法,对象还可以调用父类中所有与子类不同名的方法(这种方法没有被重写)

1.向上转型

Animal是Cat的父类Object也是Cat的父类,两个都是向上转型

3.

父类的引用指向子类的对象,该对象可以调用父类所有的成员,不能调用子类特有的成员(注意是特有的,要是进行了方法的重写仍然可以调用子类的方法)

注意:以下只针对对象调用方法的例子,访问属性的规则和访问方法的不一样

在编译阶段(javac),由编译器来指定你能调用哪些成员(通过编译类型来查找能调用的成员),此时能调用的是编译类型所在类的成员,由编译类型来决定;运行阶段,由java来决定,此时,看你的运行类型。因此,在编译通过后,进入运行阶段,先在运行类型所在的类(子类)中查找是否有该方法,有且拥有访问权限就调用,没有就往上查找

//上述案例中,编译通过后,找到animal对象的运行类型,是Cat,因此在animal.eat()时先从Cat类查找是否有该方法;若找不到的话再向上查找,而且不能调用子类特有的方法

//在Cat类中找到eat()方法,因此最终调用的是Cat中的eat方法

向下转型

1.语法:子类类型 引用名 = (子类类型) 父类引用名,()不能少

  1. & 3.

父类的引用必须指向当前目标类型的对象,即:animal对象在创建时,Animal animal =new Cat(),这时指向的就是Cat类型的对象(运行类型是Cat),而将animal进行强制类型转换,得到的目标类型也必须为Cat,不能是与Cat类同级(都是Animal的子类)的引用;此步骤执行完,对象引用cat指向Cat对象,与animal指向一样,cat的引用类型仍然是Cat,编译类型是Cat,因此该对象可以调用子类Cat的成员。此方法与创建一个新的对象不一样,没有在栈中开辟一个新的空间。

属性重写

属性的访问规则

对象访问属性时只与对象的编译类型有关,编译类型是什么,就访问该类型类中的属性,base对象访问count,得到的值是10

sub.count得到的值是20

instanceof比较操作符

判断对象的xx类型(对象的运行类型)是不是xx类型或是不是xx类型的子类,返回一个布尔值

多态的练习1

Object object =“Hello”

第一句向上转型完整表达是 Object obj = new String("Hello");

第二句将obj强制转换成String类型,根据上面第一句,可以知道obj的运行类型是String类型,因此将一个String的引用指向obj指向一个运行类型也为String类型的即为向下转型

多态的练习2

创建类Sub的对象s,s的编译类型为Sub,运行类型为Sub。s.count访问属性,看编译类型,编译类型为Sub,访问Sub中的属性,结果是20。Base b = s相当于向上转型,将b指向s指向的地址空间,即指向原来创建的Sub对象。b == s,两个对象进行比较,比较的是地址,地址相同返回true。b.count看b的编译类型,为Base,因此返回10。最后一句b调用方法,看b的运行类型,为Sub,从Sub类中找该方法,返回20。

动态绑定机制

1.对象调用方法时(不仅仅只有对象.方法名(),还包括方法中调用其它方法,调用其它方法时也会和对象的运行类型绑定,先去对象的运行类型中查找有没有该方法),该方法会和对象的运行类型绑定

2.调用属性时,没有动态绑定机制,调用到类中的某个方法时,先在该类中寻找有无该对象的声明,有的话直接调用该对象的属性,不用根据对象的运行类型来查找

在上面案例,如果注销掉子类B中的sum()方法,a.sum()的过程为:根据对象a的运行类型为B,现在B类中寻找该方法,没找到向上查找父类A中的方法,找到父类中的sum()方法,方法体中为return getI()+10,此时又调用了一次getI()方法,根据动态运行机制,根据对象a的运行类型为B,又到B类中查找getI(),方法体中的内容是返回属性I,在B类中有属性I的声明,因此返回B类中的i,返回20,再回到原来的sum()中执行20+10,得到结果为30。

再注销掉sum1(),a.sum1()的过程为:根据对象a的运行类型为B,先去B类查找,找不到向上查找父类,找到父类A中的sum1(),执行i+10,在父类A中先查找有无局部变量i,没有,就找到父类A中的属性i(在A类中声明就返回A类的i),执行10+10,得到结果20

结果如下

标签:调用,Java,对象,子类,多态,第八章,Cat,类型,方法
From: https://blog.csdn.net/m0_68811842/article/details/142685070

相关文章

  • JavaScript 小知识:轻松搞定 ArrayBuffer 到 Base64 的转换
    关键词:ArrayBuffer,Base64,栈溢出,TextDecoder,btoa,性能优化,JavaScript,兼容性摘要本文探讨了在JavaScript中将ArrayBuffer转换为Base64字符串时遇到的栈溢出问题,并提供了几种实用的解决方案。我们将通过生动的比喻来解释相关概念,比较不同方法的性能和兼......
  • JavaScript 小知识:轻松搞定 ArrayBuffer 到 Base64 的转换
    关键词:ArrayBuffer,Base64,栈溢出,TextDecoder,btoa,性能优化,JavaScript,兼容性摘要本文探讨了在JavaScript中将ArrayBuffer转换为Base64字符串时遇到的栈溢出问题,并提供了几种实用的解决方案。我们将通过生动的比喻来解释相关概念,比较不同方法的性能和兼......
  • JavaScript 小知识:轻松搞定 ArrayBuffer 到 Base64 的转换
    关键词:ArrayBuffer,Base64,栈溢出,TextDecoder,btoa,性能优化,JavaScript,兼容性摘要本文探讨了在JavaScript中将ArrayBuffer转换为Base64字符串时遇到的栈溢出问题,并提供了几种实用的解决方案。我们将通过生动的比喻来解释相关概念,比较不同方法的性能和兼......
  • 基于JAVA的鲜花商城管理系统(源码+定制+讲解)鲜花商城管理系统、鲜花商城管理平台、鲜
    博主介绍:  ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W+粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台的优质作者。通过长期分享和实战指导,我致力于帮助更多学生......
  • Java与线程
    Java与线程1.线程的实现线程是比进程更轻量级的调度执行单位,线程的引人,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件IO等),又可以独立调度。目前线程是Java里面进行处理器资源调度的最基本单位。主流的操作系统都提供了线程实现,Java语言......
  • java_day9_包的划分、形式参数、返回值、修饰符、内部类、匿名内部类
    一、包包的划分好处:1、方便管理我们的代码文件2、不同包下的文件名可以是一样的常见的包命名规则:1、按照功能划分增加-学生增加-老师增加删除-学生删除-老师删除修改......
  • 基于java+springboot的医院预约挂号系统小程序(源码+lw+部署文档+讲解等)
    课题简介医院预约挂号系统基于Java和SpringBoot开发,是改善医疗服务流程、提高患者就医体验的重要工具。该系统利用Java的稳定性和强大性能,以及SpringBoot的便捷开发框架,确保系统可靠运行和易于维护。它包含了患者信息管理、医生信息管理、科室信息管理、预约管......
  • 基于java+springboot的医学电子技术线上翻转课堂系统(源码+lw+部署文档+讲解等)
    课题简介医学电子技术线上翻转课堂系统基于Java和SpringBoot开发,是为医学教育领域量身打造的创新教学平台。该系统借助Java的稳定性和强大性能,以及SpringBoot的高效开发特性,确保系统能够稳定运行且易于维护和扩展。它涵盖了丰富的功能模块,包括课程资源管理、学......
  • 基于java+springboot的医疗设备管理系统(源码+lw+部署文档+讲解等)
    课题简介医疗设备管理系统基于Java和SpringBoot开发,是专为医疗机构设计的全面高效的设备管理解决方案。该系统利用Java的稳定性和强大性能,以及SpringBoot的便捷开发框架,确保系统可靠运行和易于维护。它涵盖了设备信息管理、采购管理、库存管理、维修管理、报废......
  • java_day8_多态、抽象类、接口
    一、多态多态的好处:1、提高了程序的维护性(由继承保证)2、提高了程序的扩展性(由多态保证)代码案例(多态的拓展性)classAnimal{publicvoideat(){System.out.println("吃");}publicvoidsleep(){System.out.println("睡");}}clas......