Java进阶学习笔记11——多态

news2024/11/16 18:03:19

什么是多态?

多态是在继承/实现情况下一种现象,表现为:对象多态和行为多态。

同一个对象,在不同时刻表现出来的不同形态。

多态的前提:

要有继承/实现关系

要有方法的重写

要有父类引用指向子类对象。

多态的具体代码体现:

People类:

package cn.ensource.d1_polymorphism;

// 父类
public class People {

    public void run() {
        System.out.println("人类快跑");
    }
}

Teacher类:

package cn.ensource.d1_polymorphism;

public class Teacher extends People{

    @Override
    public void run() {
        System.out.println("老师快跑!");
    }
}

 Student类:

package cn.ensource.d1_polymorphism;

public class Student extends People{

    @Override
    public void run() {
        System.out.println("学生快跑!");
    }
}

Test类: 

package cn.ensource.d1_polymorphism;

public class Test {
    public static void main(String[] args) {
        // 目标:认识对象多态、行为多态

        // 对象多态
        People p1 = new Teacher();
        People p2 = new Student();

        // 行为多态
        p1.run();   // 编译看左边,运行看右边,看真实对象的方法
        p2.run();
    }
}

多态的一个注意事项:

多态对对象、行为的多态,Java中的属性(成员变量)不谈多态。

package cn.ensource.d1_polymorphism;

public class Test {
    public static void main(String[] args) {
        // 目标:认识对象多态、行为多态

        // 对象多态
        People p1 = new Teacher();
        People p2 = new Student();

        // 行为多态
        p1.run();   // 编译看左边,运行看右边,看真实对象的方法
        p2.run();

        System.out.println(p1.name);   // 识别技巧:编译看左边,运行看左边,变量不讲多态性
        System.out.println(p2.name);
    }
}

多态中成员访问特点(记忆):

成员访问特点:

成员变量:编译看父类,运行看父类;

成员方方法:编译看父类,运行看子类;

多态使用的好处:

在多态的形式下,右边对象是解耦合的,更便于扩展和维护。

高内聚、低耦合。

定义方法的时候,使用父类类型的形参,可以接受一切子类对象,扩展性强,更便利。

提高了程序的扩展性,定义方法的时候,使用父类型作为参数,在使用的时候,使用具体的子类型参与操作。

弊端:不能使用子类特有的成员。

package cn.ensource.d2_polymorphism;

public class Test {
    public static void main(String[] args) {
        // 目标:认识多态的好处

        //好处一:可以实现解耦合,右边对象可以随时切换,后续业务随机改变
//        People p1 = new Student();
        People p1 = new Teacher();
        p1.run();

        // 好处二: 可以使用父类类型的变量作为形参,可以一切子类对象
        Student s = new Student();
        Teacher t = new Teacher();
    }
    
    public static void go(People p) {

    }
}

多态下,会存在一个问题,怎么解决?

多态下不能使用子类的独有功能。

package cn.ensource.d2_polymorphism;

public class Test {
    public static void main(String[] args) {
        // 目标:认识多态的好处

        //好处一:可以实现解耦合,右边对象可以随时切换,后续业务随机改变
//        People p1 = new Student();
        People p1 = new Teacher();
        p1.run();
//        p1.test();   // 无法调用子类的独有功能,因为编译时看左边,人类是没有这个方法的。

        // 好处二: 可以使用父类类型的变量作为形参,可以一切子类对象
        Student s = new Student();
        Teacher t = new Teacher();
    }

    public static void go(People p) {

    }
}

多态下的类型转换问题:

类型转换:

自动类型转换: 父类 变量名 = new 子类();

强制类型转换:子类 变量名 = (子类)父类变量;

强类型转换的一个注意事项:

存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。

运行时,如果发现对象的真实类型与强制后的类型不同,就会报类型转换异常(ClassCastException)的错误出来。

Exception in thread "main" java.lang.ClassCastException: class cn.ensource.d2_polymorphism.Student cannot be cast to class cn.ensource.d2_polymorphism.Teacher (cn.ensource.d2_polymorphism.Student and cn.ensource.d2_polymorphism.Teacher are in unnamed module of loader 'app')
	at cn.ensource.d2_polymorphism.Test.main(Test.java:19)

强转前,Java建议:

使用instanceof关键字,判断当前对象的真实类型,再进行强转。

对象回调。

 多态中的成员转型:

向上转型:

父类引用指向子类对象就是向上转型。

向下转型:

格式:子类 对象名 = (子类型)父类引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1692940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 内核之 mmap 内存映射的原理及源码解析

文章目录 前言一、简介1. mmap 是什么?2. Linux 进程虚拟内存空间 二、mmap 内存映射1. mmap 内存映射的实现过程2. mmap 内存映射流程2.1 mmap 系统调用函数2.2 ksys_mmap_pgoff 函数2.3 vm_mmap_pgoff 函数2.4 do_mmap_pgoff 函数2.5 do_mmap 函数2.6 get_unmappe…

智能化让幼儿园管理更加规范

在各个学龄阶段,幼儿园一向都是家长的教师最为操心的,一方面幼儿园孩子自主才能差,安全问题需求分外注重,另一方面,幼儿园孩子年纪小、缺少必定的认知才能和区分才能,需求加强引导。 那么怎么进步幼儿园孩子…

【vue/ucharts】ucharts 自定义格式化 y 轴数据显示(横向柱状图常用)

使用 ucharts 的柱状图时,尤其是横向柱状图会更常见,会有自定义 y 轴数据的情况,就像使用过滤器时对数据进行格式化以达到自己想要的效果一样; 比如我想要这样的效果: 官网里的栗子如图所示: 但是如果此…

探索消费新纪元:引领消费增值的潮流

亲爱的朋友们, 大家好!今天我想和大家分享一种全新的消费观念——消费增值,这是一种让消费变得更有意义和价值的创新方式。 在传统的消费模式中,我们购买商品或服务,满足需求后便结束了整个消费过程。但如今&#xff…

1.Redis之初识Redis分布式系统

1.初识Redis 1.1 官网 Redis中文网 Redis 教程 | 菜鸟教程 (runoob.com) 1.2 解释 在内存中存储数据 定义变量,不就是在内存中存储数据嘛?? Redis 是在分布式系统(进程的隔离性:Redis 就是基于网络,可以把自己内存中的变量给别的进程…

DA-CLIP论文阅读笔记

这是ICLR2024的一篇用VLM做multi-task image restoration的论文首页图看起来就很猛啊,一个unified模型搞定10个任务: 文章的贡献点主要是两个,一个是提出一个利用Image Controller,CLIP,cross-attention 和 diffusion …

外卖系统源码开发全攻略:外卖小程序与后台管理系统的设计与实现

今天,小编将详细介绍外卖系统源码的开发全攻略,从需求分析到设计与实现,为开发者提供全面指导。 一、需求分析 1.用户需求 用户是外卖系统的核心,需满足以下基本需求: -浏览菜单并下单 -实时追踪订单 -多种支付方…

3D虚拟艺术品网上展让观众沉浸式感受到艺术的魅力和力量

传统的艺术品展厅因为空间有限、内容割裂、形式静态和局限性强导致传播和宣传效果难以保障,艺术品VR线上虚拟艺术品展示借助web3d开发建模和VR虚拟现实技术,打造数字化、互动化、信息化的展示,不仅是一场视觉的革命,更是对传统展览…

智慧校园建设的进阶之路

智慧校园的建设现已到达了老练的阶段,许多学校设备充满着数字化信息,进出宿舍楼,校园一卡通体系会记载下学生信息,外来人员闯入会报警,翻开电脑就能查到学生是否在宿舍等……学生的学习和日子都充满了数字化的痕迹。但…

百度集团:AI重构,走到哪了?

内有自家公关一号“自曝”狼性文化,主动制造舆论危机。 外有,OpenAI、谷歌、字节、华为等大模型劲敌扎堆迭代新产品, 强敌环伺。 今天我们要说的是早就从BAT掉队的——百度。 最近,在武汉Aapollo Day 2024上,百度发布了…

“定融”爆大雷,害苦有钱人

据《大猫财经》Pro(ID:caimao_shuangquan)报道,中植系的恒天财富有5名理财顾问被抓了。其实因为涉及刑事犯罪,中植系不少高管之前已经进去了,现在进去的这几个,是追赃过程中遇到的不配合的那些人。 这个消息是从“恒天财富”内部…

王炸! Coze图像流发布,我用它实现了海马体影楼级形象照(内附喂饭级教程

最近Coze图像流发布,我用它实现了海马体风格照片Bot: 照片魔术师。你可以自定义提供模版,也可以根据你的需求生成模版! 这篇文章,全文不废话,只讲干货 二话不说,先来看看帅气的奥特曼怎么生成吧吧&#xff…

今日好料推荐(AI工业革命 + 产业级数据治理白皮书)

参考资料在文末获取,关注我,获取优质资源。 《ChatGPT:AI工业革命》 《ChatGPT:AI工业革命》是一本深入探讨人工智能技术,尤其是ChatGPT及其背后的GPT-4架构在各个领域中应用的书籍。这本书不仅详细介绍了ChatGPT的发…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(九)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 16 节) P16《15.ArkUI-状态管理-任务统计案例》 1、实现任务进度卡片 怎么让进度条和进度展示文本堆叠展示&#xff1…

【Linux】进程终止与进程等待

目录 进程终止 errno exit和_exit 进程等待 wait和waitpid 宏:WIFEXITED 非阻塞等待 进程终止 下面要谈的一个话题就是进程终止,就是说一个进程退出了,可能有三种情况 1.进程代码执行完,结果是正确的 2.进程代码执行完&…

代码随想录算法训练营Day4|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、 142.环形链表II、面试题 02.07. 链表相交

24. 两两交换链表中的节点 这道题的关键在于: 1、在置换两个节点的时候,当前节点需要在这俩节点之前一个节点。并且要提前保存cur.next以及cur.next.next。 2、每次置换完一组节点,cur cur.next.next 3、判断结束的标志:奇数个节点&#xf…

一个开源的个人主页模板,可以通过 Github Actions 来进行自动构建。

無名の主页 简单的小主页,原来的看够了,重新弄了一个 主页的 Logo 字体已经过压缩,若用本站 Logo 以外的字母会变回默认字体,这里是 完整字体,若无法下载,可将字体目录下的 Pacifico-Regular-all.ttf 进行替…

MySQL 带游标的存储过程(实验报告)

一、实验名称: 带游标的存储过程 二、实验日期: 2024 年 5月 25 日 三、实验目的: 掌握MySQL带游标的存储过程的创建及调用; 四、实验用的仪器和材料: 硬件:PC电脑一台; 配置&#xff1…

huggingface 笔记:PretrainModel

1 from_pretrained 从预训练模型配置中实例化一个 PyTorch 预训练模型默认情况下,模型使用 model.eval() 设置为评估模式(Dropout 模块被禁用) 要训练模型,应该首先使用 model.train() 将其设置回训练模式 1.1 主要参数 pretra…

Android 项目中自定义多个 RadioButton 并排一列选择效果实现

文章目录 1、静态版实现1.1、实现要求1.2、实现步骤1.3、代码实现1.4、代码实现说明1.5、结论 2、项目版实现(动态)1、先看效果图2、main的布局文件3、定义RadioButton的属性4、最后在代码中生成我想要的东东5、说明 3、后续优化方向 1、静态版实现 1.1、实现要求 我们需要在…