关于Java面向对象三大特征中多态的分析及出现类型转换异常ClassCastException,通过关键字instanceof解决的方法

多态

众所周知java的面向对象编程思想,有三大特征:封装、继承、多态。今天来研究一下多态,首先我们要知道多态的好处,为什么要学习多态
原始方式new的对象既能调用重写的,还能调用继承的、自己特有的成员。但缺点是扩展性差,而多态解决了这个问题,它的扩展性强,缺点就是不能直接调用子类特有功能。

多态的基本使用

特点:

  1. 必须有子父类继承或者接口实现关系
  2. 必须有方法的重写(没有重写,多态没有意义),多态主要玩儿的是重写方法
  3. 在new对象的时候是父类引用指向子类对象
Father father = new Son()
  1. 多态下不能直接调用子类特有功能

首先我们创建一个抽象类动物,再创建两个类小猫小狗继承动物。

public abstract class Animal {public abstract void eat();
}
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗爱啃骨头");}//特有方法public void lookDoor(){System.out.println("狗喜欢外出撒欢");}
}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫爱吃鱼");}//特有方法public void catchMouse(){System.out.println("猫喜欢睡大觉");}
}

不使用多态的情况下

我创建一个方法形参接收的是dog对象,如果我想让method传cat只能新建一个新的方法,扩展性很差

public class Test01 {public static void main(String[] args) {Dog dog = new Dog();method(dog);Cat cat = new Cat();method(cat);}public static void method(Dog dog){dog.eat();dog.lookDoor();}public static void method(Cat cat){cat.eat();cat.catchMouse();}
}

使用多态的情况下

我创建的方法的形参传递父类类型,调用此方法父类类型可以接收任意它的子类对象,传递哪个子类对象,就指向哪个子类对象,就调用哪个子类对象重写的方法。

public class Test02 {public static void main(String[] args) {Dog dog = new Dog();method(dog);Cat cat = new Cat();method(cat);}public static void method(Animal animal){//Animal animal = dog   Animal animal = catanimal.eat();}
}

多态中的转型

因为多态下不能直接调用子类特有功能,所以我们需要通过转型来调用

向上转型

父类引用指向子类对象,好比小类型自动提升为大类型

父类类型 对象名1 = new 子类对象() 

向下转型

向下转型好比强转,将大类型强制转成小类型

子类类型 对象名2 = (子类类型)对象名1

想要调用子类特有功能,我们就需要向下转型
借用刚才创建的类

public class Test {public static void main(String[] args) {//多态new对象  向上转型Animal animal = new Dog();animal.eat();//dog重写的animal.lookDoor();//多态不能调用子类特有功能,所以会报错//向下转型Dog dog = (Dog) animal;dog.eat();dog.lookDoor();}
}

通过关键字instanceof解决类型转换异常ClassCastException

多态向下转型时如果等号左右两边类型不一致,会出现类型转换异常,所以我们可以在向下转型之前,先通过关键字instanceof判断类型,判断结果是布尔型。

public class Test {public static void main(String[] args) {Cat cat = new Cat();method(cat);}public static void method(Animal animal){//animal = dog    animal = cat//animal.eat();//Dog dog = (Dog) animal;这里会出现类型转换异常(ClassCastException)//原因:当调用method,传递Cat对象时,animal代表的就是cat对象,此时我们将代表cat对象的animal强转成了dog,此时等号左右两边类型不一致了,所以出现了类型转换异常   	            //我们通过instanceof关键字进行下判断防止这个错误if (animal instanceof Dog){Dog dog = (Dog) animal;dog.eat();dog.lookDoor();}if (animal instanceof Cat){Cat cat = (Cat) animal;cat.eat();cat.catchMouse();}}
}

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

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

相关文章

科研绘图系列:R语言STAMP图(STAMP Plot)

介绍 STAMP图(STAMP plot)并非一个广泛认知的、具有特定名称的图表类型,而是可能指在STAMP(Statistical Analysis of Metagenomic Profiles:“STAMP: statistical analysis of taxonomic and functional profiles”)软件使用过程中生成的各种统计和可视化图表的总称。ST…

Ubuntu 24.04 上安装 Kubernetes,超级详细的教程!

Kubernetes 是一个免费的开源容器编排工具,它允许基于容器的应用程序的自动化部署、扩展和管理。 我们将介绍如何使用 Kubeadm 逐步在 Ubuntu 24.04 上安装 Kubernetes 此次演示中,我们将使用以下三个 Ubuntu 24.04 实例 Instance 1 : Master Node (k…

Studying-代码随想录训练营day30| 452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间

第30天,贪心part04,加油,编程语言:C 目录 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间 总结 452.用最少数量的箭引爆气球 文档讲解:代码随想录用最少数量的箭引爆气球 视频讲解:手…

费马点猜想,求解,如何用java编写?

“费马点”是指位于三角形内且到三角形三个顶点距离之和最短的点。这个点与三角形三顶点连线构成的三个钝角都相等且为 120。注意,这不是“费马大定理”。 package com.ai157.aigc.controller.test; import javafx.application.Application; import javafx.scene.G…

一站式天气预报解决方案,API接口轻松接入

天气对我们的日常生活有着重要的影响,无论是出门旅行还是安排工作,都需要提前了解天气情况。WAPI平台提供了一站式天气预报解决方案,通过简单的API接口,轻松获取各类天气预报数据。 这个API接口提供了丰富的天气预报信息&#xf…

AI Agent技术的最新进展与改变世界的典型项目巡礼

AI Agent 探索 1. AI Agent 技术发展以及典型项目 1.0 前 AI Agent 时代 在学术探索的浩瀚星空中,机器人技术领域的璀璨明珠莫过于Agent技术的深入研究,这一领域历来是创新与突破的温床。回溯至大模型浪潮兴起之前,Agent技术的辉煌篇章便已…

7月强化|跟武忠祥,写严选题还是880题

严选题和武老师的高数强化讲义是一套的,做的时候可以很明显感觉到,严选题上面的题跟讲义也是对应上的。如果大家要选择严选题,那么建议搭配武忠祥老师的强化课和强化讲义一起使用。😎 我当时强化阶段也是跟武老师的强化课&#xf…

欧洲智慧能源展揭幕,海博思创闪耀登场展示储能创新

近日,备受瞩目的欧洲智慧能源展(The Smarter E Europe)盛大开幕,吸引了全球能源行业的目光。在这场国际性的盛会中,中国储能行业的领军企业海博思创凭借卓越的技术实力和创新的解决方案,成为展会上一颗耀眼…

AOP在业务中的简单使用

背景 业务组有一些给开发用的后门接口,为了做到调用溯源,业务组最近需要记录所有接口的访问记录,暂时只需要记录接口的响应结果,如果调用失败,则记录异常信息。由于后门接口较多以及只是业务组内部轻度使用&#xff0…

vim未找到命令,且yum install vim安装vim失败

vim未找到命令,且yum安装vim失败 1、wget更新yum云资源,本次更新为华为云镜像资源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repowget报未找到命令,请查看文章Linux wget…

黑马苍穹外卖技术亮点 详情

1.使用工厂模式和策略模式实现布隆过滤器解决缓存穿透问题 Bitmap Bitmap是一种数据结构,它使用位图来表示数据。在处理大量数据时,Bitmap可以通过将每个数据元素映射到一个位,然后使用位运算来对数据进行操作。 通过使用Bitmap&#xff0c…

C++期末整理

课堂笔记 构造与析构 #include <iosteam> #include <cstring> using namespace std;struct Date {int y, m, d;void setDate(int, int, int);Date(int yy, int mm, int dd) {y yy, m mm, d dd;} };class Student { private:char* name;Date birthday; public:…

视频号矩阵源码:构建短视频生态的基石

在数字化时代&#xff0c;视频内容已成为连接品牌与消费者的重要桥梁。视频号矩阵源码&#xff0c;作为短视频营销自动化的创新引擎&#xff0c;正在帮助内容创作者和营销团队以前所未有的效率和智能&#xff0c;管理和扩展他们的视频内容。本文将深入探讨视频号矩阵源码的核心…

RTL8211FSI PHY电路设计

文章目录 硬件设计引脚功能框图说明PHYADDRPageLED 模式自动协商/速度/全半双工模式Soft Reset上电顺序 原理图设计参考 软件控制&#xff08;FPGA&#xff09;硬件调试 硬件设计 引脚 笔者前代数字采集板采用的 PHY 芯片是博通 Boardcom 的 B50610&#xff0c;其仅支持 0 ∼…

leetcode 152. 乘积最大子数组「贪心」「动态规划」

152. 乘积最大子数组 题目描述&#xff1a; 给你一个整数数组nums&#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff0c;并返回该子数组所对应的乘积 思路1&#xff1a;贪心 由于 n u m s [ i ] nums[i] nums[i]都是整数&#xff0c;所以多乘一些数肯定不会让绝…

Java 方法中循环调用具有事务的方法

在Java中&#xff0c;循环调用一个具有事务的方法时&#xff0c;需要特别注意事务的边界和管理。通常&#xff0c;事务的边界是由框架&#xff08;如Spring&#xff09;来控制的&#xff0c;确保方法执行时数据的完整性和一致性。然而&#xff0c;在循环中调用事务方法时&#…

RAG:本地部署Langchain-Ollma(Windows)

RAG&#xff1a;本地部署Langchain&#x1f99c;&#x1f517;-Ollma&#x1f42b;(Windows) RAG&#xff0c;即“Retrieval Augmented Generation”&#xff08;检索增强生成&#xff09;&#xff0c;是一种结合了检索和生成技术的自然语言处理模型。它主要用于文本生成任务&…

对SRS媒体服务器进行漏洞扫描时,SRS的API模块会出现漏洞,如何修补这些漏洞的简单方法

目录 一、引言 1、srs介绍 2、媒体流介绍 3、应用场景 二、SRS的http_api介绍、及漏洞 1、概述 2、http_api模块的作用 &#xff08;1&#xff09;提供HTTP API服务 &#xff08;2&#xff09;管理和监控SRS服务器 &#xff08;3&#xff09;自定义开发 三、漏洞扫描…

单位立方体各个面上的法向量,向量场以及每个面上的通量

单位立方体各个面上的法向量&#xff0c;向量场 F ( x , y , z ) \mathbf{F} (x, y, z) F(x,y,z) 以及每个面上的通量 flyfish 假设我们有一个单位立方体&#xff0c;向量场 F ( x , y , z ) \mathbf{F} (x, y, z) F(x,y,z) 在该立方体上。 法向量 &#xff1a;单位立方…

情绪识别反馈训练系统

系统应用简介 情绪识别检测训练系统可以通过语音、实时面部表情、静态情绪图片智能检测使用者的情绪&#xff0c;对异常情绪进行预警&#xff0c;以达到及时明晰情绪状态并辅助缓解负性情绪的目的。 应用范围&#xff1a;适用于年满足12周岁及以上人群。 二、系统基本原理 …