【JavaSE】Java基础语法(二十):多态

news2024/11/24 17:53:25

文章目录

  • 1. 多态的概述
  • 2 .多态中的成员访问特点
  • 3. 多态的好处和弊端
  • 4. 多态中的转型
  • 5. 多态中转型存在的风险和解决方案 (应用)
  • 6. 多态的实用价值



在这里插入图片描述


1. 多态的概述

在这里插入图片描述

  • 什么是多态
    • 同一个对象,在不同时刻表现出来的不同形态
  • 多态的前提
    • 要有继承或实现关系
    • 要有方法的重写
    • 要有父类引用指向子类对象
  • 代码演示
class Animal {
	public void eat(){
		System.out.println("动物吃饭");
	}
}

class Cat extends Animal {
	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
}

public class Test1Polymorphic {
	/*
		多态的前提:
		1. 要有(继承 \ 实现)关系
		2. 要有方法重写
		3. 要有父类引用, 指向子类对象
		*/
	public static void main(String[] args) {
		// 当前事物, 是一只猫
		Cat c = new Cat();
		
		// 当前事物, 是一只动物
		Animal a = new Cat();
		a.eat();
	}
}

2 .多态中的成员访问特点

  • 成员访问特点
    • 成员变量
      • 编译看父类,运行看父类
  • 成员方法
    • 编译看父类,运行看子类
  • 代码演示
class Fu {
	int num = 10;
	public void method(){
		System.out.println("Fu.. method");
	}
}

class Zi extends Fu {
	int num = 20;
	public void method(){
		System.out.println("Zi.. method");
	}
}

public class Test2Polymorpic {
	/*
		多态的成员访问特点:
		成员变量: 编译看左边 (父类), 运行看左边 (父类)
		成员方法: 编译看左边 (父类), 运行看右边 (子类)
	*/
	public static void main(String[] args) {
		Fu f = new Zi();
		System.out.println(f.num);
		f.method();
	}
}

3. 多态的好处和弊端

  • 好处
    • 提高程序的扩展性。定义方法时候,使用父类型作为参数,在使用的时候,使用具体的子类型
      参与操作
  • 弊端
    • 不能使用子类的特有成员

4. 多态中的转型

  • 向上转型
    • 父类引用指向子类对象就是向上转型
  • 向下转型
    • 格式:子类型 对象名 = (子类型)父类引用;
  • 代码演示
Zi z = (Zi) f;

5. 多态中转型存在的风险和解决方案 (应用)

  • 风险

    • 如果被转的引用类型变量,对应的实际类型和目标类型不是同一种类型,那么在转换的时候就会出现 ClassCastException
  • 解决方案

    • 关键字
      • instanceof
    • 使用格式
      • 变量名 instanceof 类型
        通俗的理解:判断关键字左边的变量,是否是右边的类型,返回boolean类型结果
if(a instanceof Dog){
	Dog dog = (Dog) a;
	dog.watchHome();
}

6. 多态的实用价值

多态在面向对象编程中有着广泛的使用价值,主要表现在以下方面:

可替换性:多态允许子类对象替换父类对象,并且可以调用覆盖了父类方法的子类方法。这样可以极大地增加代码的可复用性和可扩展性。

灵活性:通过多态,一个超类对象可以调用子类对象的方法,从而使代码更加灵活和易于扩展。程序员只需要引用超类对象而不是具体的子类对象,就能够避免对代码进行大量修改的情况。

统一性:通过多态性,所有继承自父类的子类都能以相同的方式处理,从而增强了代码的可维护性和可读性。例如,在Java的集合框架中,所有实现了List接口的类都能够使用相同的方法对列表进行操作。

可扩展性:通过多态,我们可以很容易地扩展应用程序的功能。例如,我们可以创建新的子类,并覆盖它们的父类方法,从而为应用程序添加新的功能,而无需改变现有的代码。

多态是面向对象编程中非常重要的概念,它可以使软件系统更加灵活和可扩展,同时还可以提高代码的可读性、可维护性和可复用性,从而降低软件开发的成本。


在这里插入图片描述

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

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

相关文章

SQLite 数据库入门教程(GO)

文章目录 SQLite数据库入门教程一、SQLite 简介1、什么是 SQLite?2、为什么要用 SQLite? 二、SQLite 安装1、在 Windows 上安装 SQLite2、在 Linux 、Mac OS上安装 SQLite 三、SQLite 命令四、SQLite 使用1、SQLite 数据类型2、SQLite 语法3、SQLite 可视…

chatgpt赋能python:Python百分比怎么算?-从基础到逐层深入

Python百分比怎么算? - 从基础到逐层深入 Python是目前全球最流行的编程语言之一,由于其易学易用的特点,广泛地应用于数据处理、Web开发、自动化测试等不同领域。当我们需要对一些数据进行计算和分析时,经常需要对百分比进行计算…

Linux第二天

上传 scp -r 本地文件路劲 用户名目标主机地址:路径 下载:scp -r 用户名目标主机地址:路径 本地目录 ls -A /root //查看root文件下所有的隐藏文件 命令:ls 选项: -l:查看文件属性 -h:文…

【Python】继承与多态

知识目录 一、写在前面✨二、继承三、多态四、Account和FreeChecking类的实现五、总结撒花😊 一、写在前面✨ 大家好!我是初心,希望我们一路走来能坚守初心! 今天跟大家分享的文章是 Python中的继承与多态 ,希望能帮…

在windows下安装linux和kali子系统

目录 安装子系统 报错解决官方方法 步骤 1 - 启用适用于 Linux 的 Windows 子系统 步骤 2 - 检查运行 WSL 2 的要求 步骤 3 - 启用虚拟机功能 步骤 4 - 下载 Linux 内核更新包 步骤 5 - 将 WSL 2 设置为默认版本 步骤 6 - 安装所选的 Linux 分发 排查安装问题 下载发行…

【JavaSE】Java基础语法(二十一):内部类

文章目录 1. 内部类的基本使用2. 成员内部类3. 局部内部类4. 匿名内部类5. 匿名内部类在开发中的使用(应用) 1. 内部类的基本使用 内部类概念 在一个类中定义一个类。举例:在一个类A的内部定义一个类B,类B就被称为内部类 内部类定…

YOLOv8目标检测实战:Android手机部署 (视频课程)

课程链接:https://edu.csdn.net/course/detail/38595 YOLOv8 目标检测基于先前 YOLO 版本的成功,引入了新功能和改进,进一步提升了性能和灵活性。 本课程在Windows上手把手演示YOLOv8(YOLOv8n和YOLOv8s)目标检测在An…

jvm 分析调优工具-学习笔记

jvm 分析调优工具 jps命令查看java进程pid jps 列出java进程名(不完整类名) 和pid jps -l 列出java进程名(完整类名) 和pid jmap命令查看java进程占用的jvm资源情况 jmap -histo pid 查看内存情况 jmap -heap pid 查看java程序的堆占用信息 jmap -dump 导出heap快照分析文件he…

22 VueComponent 响应式处理

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 测试用例如下, 一个简单的 按钮事件的触发 问题的调试 数据…

老macbook升级新版本(Big sur、Monterey)

老macbook升级新版本(Big sur、Monterey) 一、前期须知以及准备1.摘要2.设备3.升级方法3.前期准备 二、引导U盘的搭建1.下载安装程序2.U盘格式问题3.下载系统镜像并写入U盘 三、系统安装结束语 一、前期须知以及准备 1.摘要 对于老版本的macbook一系列…

代码随想录训练营Day53| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

目录 学习目标 学习内容 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习目标 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习内容 1143.最长公共子序列 1143. 最长公共子序列 - 力扣(LeetCode)ht…

PS磨皮插件免费电脑版Portraiture4.03下载及使用教程

Portraiture是一款智能磨皮插件,为Photoshop和Lightroom添加一键磨皮美化功能,快速对照片中皮肤、头发、眉毛等部位进行美化,Portraiture 4用于人像图片润色,磨皮等,减少了人工选择图像区域的重复劳动。它能智能地对图…

chatgpt赋能python:如何在Python中输入字符

如何在Python中输入字符 Python是一种非常流行的编程语言,它被广泛应用于各种领域,包括Web开发、人工智能、数据分析、科学计算等。在Python中输入字符是一项基本的操作,本文将介绍常见的输入字符方式以及注意事项。 使用input()函数输入字…

[数据结构] AVL树的插入旋转 和 概念理解

文章目录 定义 && 性质定义性质 实现思路架构节点AVL树框架Insert(插入)左单旋右单旋左右双旋右左双旋 定义 && 性质 定义 二叉搜索树虽可以缩短查找的效率,但 如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c…

初学Qt(Day04)

今日目标 创建一个类似游戏手柄的窗口,每次鼠标点击拖动手柄,在qt开发界面输出坐标,每当松开鼠标,手柄自动复位。 目标是实现类似下面这种 先说结论(免得我又忘记了):没写完,是一…

Makefile基础教学(include的使用方法)

文章目录 前言一、include在makefile中的概念介绍二、include使用示例三、include中需要注意的一些操作1. 在include前加-选项2. include触发规则创建了文件会发生什么3. include包含的文件夹存在 总结 前言 本篇文章将讲解include的使用方法,在C语言中使用include…

chatgpt赋能python:Python与SEO的奇妙关系

Python与SEO的奇妙关系 SEO(Search Engine Optimization),中文翻译为搜索引擎优化,是指通过对网站进行各种技术和内容方面的优化,来提升网站在搜索引擎自然排名中的位置,进而吸引更多的潜在客户。而Python语言,则成为…

jQuery-attr()、val()、add()属性和each函数

<!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>jQuery-attr()、add()属性和each函数</title> <script type"text/j…

[数据集][目标检测]数据集VOC格式绝缘子缺陷检测数据集VOC-4086张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;4086 标注数量(xml文件个数)&#xff1a;4086 标注类别数&#xff1a;3 标注类别名称:["jueyuanzi",&…

25 VueComponent 的生命周期

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 测试用例如下, 一个简单的 按钮事件的触发 问题的调试 这里…