12Java基础之多态
多态
多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态。
多态存在的条件
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
多态的一个注意事项
- 多态是对象、行为的多态,Java中的属性(成员变量)不谈多态。
案例:
父类:
public class Animal {
public String name ="动物名称";
public void cry(){
System.out.println("动物会叫");
}
}
子类:
public class Cat extends Animal{
public String name = "猫的名称";
@Override
public void cry(){
System.out.println("喵喵叫");
}
}
public class Dog extends Animal{
public String name = "狗的名称";
@Override
public void cry(){
System.out.println("汪汪叫");
}
}
main方法:
public static void main(String[] args) {
// 对象多态
Animal c = new Cat();
Animal d = new Dog();
c.cry();// 编译看左边,运行看右边
d.cry();
System.out.println(c.name);// 成员变量:编译看左,运行也看左。
System.out.println(d.name);
}
输出结果:
喵喵叫
汪汪叫
动物名称
动物名称
使用多态的好处
- 在多态形式下,右边对象时解耦合的,更便于拓展和维护。
- 定义方法时,使用父类类型的形参,可以接收一切子类对象,拓展性更强、更便利。
案例:
父类:
public class Animal {
public void cry(){
System.out.println("动物会叫");
}
}
子类:
public class Cat extends Animal{
@Override
public void cry(){
System.out.println("喵喵叫");
}
}
public class Dog extends Animal{
@Override
public void cry(){
System.out.println("汪汪叫");
}
}
main方法:
public static void main(String[] args) {
// 1. 多态下右边对象时解耦合的。
// Animal a = new Cat();
Animal a = new Dog();
a.cry();
Cat c = new Cat();
go(c);
Dog d = new Dog();
go(d);
System.out.println("--------------------------------");
}
// 2.多态下,父类类型作为方法的形参,可以接收一切子类对象,方法更便利。
public static void go(Animal c){
System.out.println("开始。。。");
c.cry();// 对象回调
// 多态下存在的一个问题:不能调用子类独有的功能方法
// c.lookDoor(); // 报错
// c.catchMouse(); // 报错
System.out.println("结束。。。");
}
输出结果:
汪汪叫
开始。。。
喵喵叫
结束。。。
开始。。。
汪汪叫
结束。。。
- 多态下存在一个问题:不能调用子类独有的功能方法。
多态下类型转换问题
类型转换
- 自动类型转换:父类 变量名 = new 子类()。例如:People p = new Teacher();
- 强制类型转换:子类 变量名 = (子类)父类变量。例如:Teacher t = (Teacher)p;
强制类型转换的一个注意事项
- 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。
- 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来。
强制类型转换前,Java建议我们去做什么事情?
建议使用instanceof判断当前对象的真实类型:对象 instanceof 类型
案例:
父子类沿用上边的动物类和猫类、狗类
main方法:
public static void main(String[] args) {
// 1. 多态下右边对象时解耦合的。
Animal a = new Dog();
a.cry();
// 强制类型转换:可以解决多态下不能直接调用子类的方法的问题。
Dog d = (Dog)a;
d.lookDoor();
// 强制类型转换的注意事项:1.只要有继承或者实现关系的两个类就可以强制转换。
// 编译阶段不会报错(写代码),但是运行时可能出现强制类型转换异常。
// Cat c = (Cat) a;// 编译不报,运行时会报错
Cat c = new Cat();
go(c);
}
// 2.多态下,父类类型作为方法的形参,可以接收一切子类对象,方法更便利。
public static void go(Animal a){
System.out.println("开始。。。");
a.cry();// 对象回调
//因此,Java建议强制类型转换之前,先判断对象的真实类型,在进行强转。
if(a instanceof Dog){
Dog d1 = (Dog)a;
d1.lookDoor();
}
else if(a instanceof Cat){
Cat c1 = (Cat)a;
c1.catchMouse();
}
else{
System.out.println("不是狗,不能强转");
}
System.out.println("结束。。。");
}
输出结果:
汪汪叫
狗会看门
开始。。。
喵喵叫
猫会抓老鼠
结束。。。
12Java基础之多态的更多相关文章
- Java基础十一--多态
Java基础十一--多态 一.多态定义 简单说:就是一个对象对应着不同类型. 多态在代码中的体现: 父类或者接口的引用指向其子类的对象. /* 对象的多态性. class 动物 {} class 猫 ...
- 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)
五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...
- Java基础之多态和泛型浅析
Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...
- C#非常重要基础之多态
前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...
- 30天C#基础巩固-----多态,工厂模式
自己要有自信,相信自己可以找到好的工作.面对校招,企业更加看重自己的基础,这30天就把C#的基础好好的复习,学习下.笔记一定要认真的记录,这样自己复习回顾的时候就有了可以参考的东西了. 一: ...
- Objective-C基础之──多态
Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对 ...
- Python基础之多态与多态性
切记:不要将多态与多态性这二者混为一谈,只要分开,就会很明朗了. 一.多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:动物分为人类.狗类.猪类(在定义角 ...
- iOS开发Objective-C基础之──多态
Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对 ...
- 【Java基础】多态
首先先来个总结: 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消 ...
- java基础之 多态
在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言 ...
随机推荐
- RPC实战与核心原理之时钟轮
时钟轮在RPC中的应用 回顾 在分布式环境下,RPC 框架自身以及服务提供方的业务逻辑实现,都应该对异常进行合理地封装,让使用方可以根据异常快速地定位问题:而在依赖关系复杂且涉及多个部门合作的分布式系 ...
- AI模型的回调能力的理解和实现
前言 BigTall最近把RAG和Agent的原理想通了,对于"一切都是提示词"的理解又更多了一些.本文把我的理解大致整理了一下,给出BigTall自己的一个实验.希望能够对大家有 ...
- 深入浅出了解生成模型-2:VAE模型原理以及代码实战
From: https://www.big-yellow-j.top/posts/2025/05/11/VAE.html 前文已经介绍了GAN的基本原理以及代码操作,本文主要介绍VAE其基本原理以及代 ...
- SuperSocket 2.0 的发布标志着.NET Socket 服务器框架迈入了一个全新的时代
2025 年 4 月 20 日 - SuperSocket 团队自豪地宣布正式发布 SuperSocket 2.0,这是这款适用于 .NET 的高性能.可扩展套接字服务器应用程序框架的一个重要里程碑. ...
- 利用堆排序和分治法求解千万级数据排序的Top K问题—百度面试
目录 问题描述 问题解析 第一步:查询次数统计 第二步:找出Top 10 算法一:排序 算法二:部分排序 算法三:堆排序 1.构造初始堆 2.首尾交换,断尾重构 3.迭代执行第二步 算法四:分治法 小 ...
- 如何彻底的卸载mysql
在Windows系统下面改如何彻底的卸载我们的mysql服务呢. 1.首先我们先停止mysql服务:net stop mysql 然后在控制面板里面找到我们的mysql,然后给他卸载掉.然后在之前安装 ...
- ZMM050N
/********* Begin Procedure Script ************/ BEGIN var_out = with a as ( select mandt,matnr,werks ...
- 记一次 .NET 某发证机系统 崩溃分析
一:背景 1. 讲故事 前些天有位朋友在微信上找到我,说他的系统有偶发崩溃,自己也没找到原因,让我帮忙看下怎么回事,我分析dump一直都是免费的,毕竟对这些东西挺感兴趣,有问题可以直接call我,好了 ...
- 袋鼠云秋季发布会圆满落幕,AI驱动让生产力数智化
在当今时代,AI 的发展如汹涌浪潮,其速度之快超越了任何历史时期.它以前所未有的迅猛之势,渗入到各个领域的不同场景之中,悄然重塑着商业模式与人们的生活方式. 在 AI 逐渐成为企业基础属性的背景下,袋 ...
- 我的grunt 插件
"angular-ui-router": "^0.2.18", "grunt": "^0.4.5", "gru ...