多态

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

  • 多态存在的条件

    • 有继承关系
    • 子类重写父类的方法
    • 父类引用指向子类对象

多态的一个注意事项

  • 多态是对象、行为的多态,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("结束。。。");
}
输出结果:
汪汪叫
开始。。。
喵喵叫
结束。。。
开始。。。
汪汪叫
结束。。。
  • 多态下存在一个问题:不能调用子类独有的功能方法。

多态下类型转换问题

  • 类型转换

    1. 自动类型转换:父类 变量名 = new 子类()。例如:People p = new Teacher();
    2. 强制类型转换:子类 变量名 = (子类)父类变量。例如:Teacher t = (Teacher)p;
  • 强制类型转换的一个注意事项

    1. 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。
    2. 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(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基础之多态的更多相关文章

  1. Java基础十一--多态

    Java基础十一--多态 一.多态定义 简单说:就是一个对象对应着不同类型. 多态在代码中的体现: 父类或者接口的引用指向其子类的对象. /* 对象的多态性. class 动物 {} class 猫 ...

  2. 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)

    五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...

  3. Java基础之多态和泛型浅析

    Java基础之多态和泛型浅析 一.前言: 楼主看了许多资料后,算是对多态和泛型有了一些浅显的理解,这里做一简单总结 二.什么是多态? 多态(Polymorphism)按字面的意思就是“多种状态”.在面 ...

  4. C#非常重要基础之多态

    前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...

  5. 30天C#基础巩固-----多态,工厂模式

         自己要有自信,相信自己可以找到好的工作.面对校招,企业更加看重自己的基础,这30天就把C#的基础好好的复习,学习下.笔记一定要认真的记录,这样自己复习回顾的时候就有了可以参考的东西了. 一: ...

  6. Objective-C基础之──多态

    Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对 ...

  7. Python基础之多态与多态性

    切记:不要将多态与多态性这二者混为一谈,只要分开,就会很明朗了. 一.多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:动物分为人类.狗类.猪类(在定义角 ...

  8. iOS开发Objective-C基础之──多态

    Objective-C语言是面向对象的高级编程语言,因此,它具有面向对象编程所具有的一些特性,即:封装性.继承性和多态性. 今天介绍一下Objective-C中的多态性. 一.什么是多态 多态:不同对 ...

  9. 【Java基础】多态

    首先先来个总结: 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消 ...

  10. java基础之 多态

    在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言 ...

随机推荐

  1. OSS 上传和删除图片 Python SDK

    最近在搞一些全栈的小项目, 涉及到图片的上传, 删改等操作, 想着还是用这个云服务器来整一波, 阿里云的 OSS对象存储, 40G 1年9块钱, 值得拥有! 前提 购买了阿里云 OSS 服务 创建了 ...

  2. TVM Pass优化 -- InferType 类型推导

    定义(What) InferType,类型推断,顾名思义,给表达式进行类型的推断 直接上代码 import tvm from tvm import relay import numpy as np d ...

  3. 在windows server中安装docker

    windows server 建议选择win10系统. 首先要下载wsl2: 主要参考微软官方文档:https://learn.microsoft.com/en-us/windows/wsl/inst ...

  4. 基于Python运用PyComCAD进行Autocad二次开发实例汇集

    本文将对运用Pycomcad库(Pycomcad详见,https://github.com/JohnYang1210/PycomCAD)做的一些项目及其效果图进行展示(欢迎各位老铁pull reque ...

  5. C#学习:构建一个更真实的基于LLM的简历评估系统

    前言 昨天的Demo以txt文件为例进行说明,并且评估标准写死了,跟真实的简历评估系统差别太大了.今天分享的是经过改进后更加真实的基于LLM的简历评估系统. 使用AI生成了5份不同的简历,如下所示: ...

  6. 怒更一波TransDuck免费的声音克隆和AI配音功能

    宝子们! 最近咱软件TransDuck的免费声音克隆和AI配音功能被大家用爆啦!感谢各位自来水疯狂安利!! DD这里也是收到好多用户提的宝贵建议!所以,连夜肝了波更新! 这次重点更新使用克隆音色进行A ...

  7. Qt 的一个大坑:visual studio中setStyleSheet不支持jpg

    在代码中设置QWidget的背景图,一般会使用setStyleSeeht函数去设置样式表: border-image:("c:x.png"); 这里有个大坑:不支持jpg图片!

  8. MySQL中用户及权限管理(mysql8.0版本)

    概述 在MySQL中,用户与权限管理属于关键的安全机制,能让你对数据库的访问进行精准控制 MySQL用户管理 创建用户信息 语法 CREATE USER username@'host' IDENTIF ...

  9. MySQL基础学习——SQL对数据库中表的记录进行操作

    SQL对数据库中表的记录进行操作 sql添加表的记录 语法: 向表中插入某些列:insert into 表名 (列名1,列名2,列名3...) values(值1,值2,值3....); 向表中插入所 ...

  10. ChatMoney让你变成HR高手!

    本文由 ChatMoney团队出品 在快节奏的现代职场中,招聘是每一个企业都绕不开的重要环节.然而,传统的招聘流程往往繁琐而低效,从海量简历的筛选,再到后续的评估与决策,每一个环节都耗费着HR人员大量 ...