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.这也是为什么有人说,使用面向对象语言 ...
随机推荐
- OSS 上传和删除图片 Python SDK
最近在搞一些全栈的小项目, 涉及到图片的上传, 删改等操作, 想着还是用这个云服务器来整一波, 阿里云的 OSS对象存储, 40G 1年9块钱, 值得拥有! 前提 购买了阿里云 OSS 服务 创建了 ...
- TVM Pass优化 -- InferType 类型推导
定义(What) InferType,类型推断,顾名思义,给表达式进行类型的推断 直接上代码 import tvm from tvm import relay import numpy as np d ...
- 在windows server中安装docker
windows server 建议选择win10系统. 首先要下载wsl2: 主要参考微软官方文档:https://learn.microsoft.com/en-us/windows/wsl/inst ...
- 基于Python运用PyComCAD进行Autocad二次开发实例汇集
本文将对运用Pycomcad库(Pycomcad详见,https://github.com/JohnYang1210/PycomCAD)做的一些项目及其效果图进行展示(欢迎各位老铁pull reque ...
- C#学习:构建一个更真实的基于LLM的简历评估系统
前言 昨天的Demo以txt文件为例进行说明,并且评估标准写死了,跟真实的简历评估系统差别太大了.今天分享的是经过改进后更加真实的基于LLM的简历评估系统. 使用AI生成了5份不同的简历,如下所示: ...
- 怒更一波TransDuck免费的声音克隆和AI配音功能
宝子们! 最近咱软件TransDuck的免费声音克隆和AI配音功能被大家用爆啦!感谢各位自来水疯狂安利!! DD这里也是收到好多用户提的宝贵建议!所以,连夜肝了波更新! 这次重点更新使用克隆音色进行A ...
- Qt 的一个大坑:visual studio中setStyleSheet不支持jpg
在代码中设置QWidget的背景图,一般会使用setStyleSeeht函数去设置样式表: border-image:("c:x.png"); 这里有个大坑:不支持jpg图片!
- MySQL中用户及权限管理(mysql8.0版本)
概述 在MySQL中,用户与权限管理属于关键的安全机制,能让你对数据库的访问进行精准控制 MySQL用户管理 创建用户信息 语法 CREATE USER username@'host' IDENTIF ...
- MySQL基础学习——SQL对数据库中表的记录进行操作
SQL对数据库中表的记录进行操作 sql添加表的记录 语法: 向表中插入某些列:insert into 表名 (列名1,列名2,列名3...) values(值1,值2,值3....); 向表中插入所 ...
- ChatMoney让你变成HR高手!
本文由 ChatMoney团队出品 在快节奏的现代职场中,招聘是每一个企业都绕不开的重要环节.然而,传统的招聘流程往往繁琐而低效,从海量简历的筛选,再到后续的评估与决策,每一个环节都耗费着HR人员大量 ...