11.Java面向对象----多态

news2025/6/19 17:57:13

Java面向对象—多态

面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统开发方式模型的研究。对 Java 语言来说,一切皆是对象。把现实世界中的对象抽象地体现在编程世界中,一个对象代表了某个具体的操作。一个个对象最终组成了完整的程序设计,这些对象可以是独立存在的,也可以是从别的对象继承过来的。对象之间通过相互作用传递信息,实现程序开发。
面向对象的三大核心特性:

  • 封装性
  • 继承性
  • 多态性

今天我们重点来讲解Java面向对象的第三个特性:多态性。

一、多态的定义

在Java里,多态是同一个行为具有不同表现形式或形态的能力,即对象多种表现形式的体现,就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
在这里插入图片描述
举个栗子:打印机分很多种,有黑白打印机和彩色打印机,黑白打印机打印的效果只能是黑白两色。彩色打印机打印效果可以是多种色彩的组合。同样是打印机,不同的型号打印出的结果不同。在我们开发过程中,同一父类,不同子类呈现的结果不同,就是多态。

二、多态的实现条件

  • 实现继承关系:实现继承关系,是将两个类建立起必要的联系,通过这种联系,展现不同的引用形态。
  • 重写父类方法:重新父类方法,是根据不同子类的不同情况,通过方法重写实现展示效果的不同,效果不同,就展示了类的不同形态。
  • 父类的引用指向子类的对象:通过对父类引用的实例化,实例化出不同的子类对象,最终实现类的多种形态的展示。

示例代码:
飞机类

/**
 * 飞机类
 *
 */
public class Airplane {

	public int wing;//飞机机翼数量
	
	public String engine;//发动机型号
	
	/**
	 * 飞机用途方法
	 */
	public void purpose() {
		System.out.println("我是一架飞机,我能起飞");
	}
}

轰炸机,继承飞机类

/**
 * 轰炸机
 *
 */
public class Bomber extends Airplane{

	public int ammunition;//导弹数量
	
	/**
	 * 轰炸机用途方法
	 */
	public void purpose() {
		System.out.println("我是一架轰炸机,我能发射导弹");
	}
}

民用客机,继承飞机类

/**
 * 民用客机
 *
 */
public class Aircraft extends Airplane{

	public int guest;//载客人数
	
	/**
	 * 民用客机用途方法
	 */
	public void purpose() {
		System.out.println("我是一架民用客机,我能承载普通客人");
	}
}

测试类

public class Test {

	public static void main(String[] args) {
		Aircraft aircraft=new Aircraft();//实例化民用客机类对象
		
		Bomber bomber=new Bomber();//实例化轰炸机类对象
		
		Airplane airplane=null;//创建飞机类引用
		
		airplane=aircraft;//将民用客机对象赋值给飞机类引用
		airplane.purpose();//调用飞机用途方法
		
		airplane=bomber;//将轰炸机对象赋值给飞机类引用
		airplane.purpose();//调用飞机用途方法

	}

}

在这里插入图片描述
三、多态的好处
使用多态,我们可以很好的完成代码的解耦合工作,加强代码的可扩展性,使代码更加灵活,在不改变原有方法的情况下使类的可用性提高,灵活性增强。

  • 降低模块的耦合度
  • 增强可以类的可替换性
  • 增强模块的可扩展性
  • 增强模块的灵活性

四、对象转型

向上转型
父类的引用指向子类的对象,称为向上转型。 作用是:提高程序的扩展性。

public class Test {

	public static void main(String[] args) {
		Aircraft aircraft=new Aircraft();//实例化民用客机类对象
		
		Bomber bomber=new Bomber();//实例化轰炸机类对象
		
		Airplane airplane=null;//创建飞机类引用
		
		airplane=aircraft;//将民用客机对象赋值给飞机类引用(向上转型)
		airplane.purpose();//调用飞机用途方法
		
		airplane=bomber;//将轰炸机对象赋值给飞机类引用(向上转型)
		airplane.purpose();//调用飞机用途方法

	}

}

向下转型
将子类的引用指向了父类的对象,该写法是对象的向下转型;向下转型不是自动的,需要强制类型转换符进行转换。作用:实现子类扩展方法的调用。

public class Test {

	public static void main(String[] args) {
		
		Aircraft boeing747=new Aircraft();//实例化子类对象
		
		Airplane plane=boeing747;//将子类对象赋值给父类引用(向上转型)
		
		Aircraft boeing_747=(Aircraft)plane;//将父类对象赋值给子类引用(向下转型)
		
		boeing_747.purpose();//调用子类方法
	}

}


instanceof关键字
instanceof是Java中的一个二元运算符,用来测试一个对象是否为一个类的实例。

public class Test {

	public static void main(String[] args) {

		Airplane airplane=new Bomber();
		System.out.println(airplane instanceof Airplane);
		System.out.println(airplane instanceof Bomber);
		System.out.println(airplane instanceof Aircraft);
	}
}

在这里插入图片描述

五、编译期多态与运行期多态

编译和运行的划分
编译期是指 代码编译成字节码的过程(不是写代码的过程)
运行期是指 类字节码被加载进内存(从静态结构转换为内存运行结构)的过程

编译期多态是指方法重载,运行期多态是指方法重写和向上(下)转型
那么为什么说方法重载是编译期多态呢?
因为调用哪个方法在编译成字节码的时候,是可以根据参数类型、参数个数就确定下来的。所以在编译过程中就确定了多态的结果。
又为什么说方法重写、向上转型是运行时多态呢?
因为在转型中或方法的调用涉及到了方法重写,此时需要先去父类中找到该方法,然后再去判断子类是否重写了该方法,如果子类重写了该方法,那么就会调用子类的方法。所以需要在代码运行时才能确定多态的结果。

六、面向对象的三大特性总结

面向对象的三大特性,为封装、继承、多态。个人认为,继承是三大特性的核心。封装是将代码进行整合,封装后增加代码的聚合度;继承是建立了类与类之间的关系,建立了耦合度;多态是通过重写方式实现不同效果的展示,降低了耦合度。三大特性是一个整体,虽然可以独立使用,但是相互配合,整合起来的代码,更有优势和效果,真正的去实现了代码的高内聚,低耦合。

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

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

相关文章

Nacos介绍与安装

文章目录一、什么是Nacos(摘抄自官网介绍)二、Nacos安装2.1 下载安装包2.2 解压2.3 配置端口2.4.启动2.5.访问一、什么是Nacos(摘抄自官网介绍) Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发…

【模型复现】densenet,增加残差结构连接,复用特征图的角度降低了计算量还提升了精度,transition_block压缩特征图

相比ResNet,DenseNet[1608.06993] Densely Connected Convolutional Networks (arxiv.org)提出了一个更激进的密集连接机制:即互相连接所有的层,具体来说就是每个层都会接受其前面所有层作为其额外的输入。下图为DenseNet的密集连接机制。可以…

聚观早报|Uber分拆旗下网约车服务; 字节跳动首度超越腾讯和阿里

今日要闻:Uber分拆旗下网约车服务Careem;字节跳动首度超越腾讯和阿里;搜狗追上GPT-4需要3年左右;苹果首款头戴装置将延至6月量产;全面注册制新规今起正式落地Uber分拆旗下网约车服务Careem Uber 旗下网约车服务 Careem…

【CSS】绝对定位元素设置 水平 / 垂直 居中 ( 绝对定位元素居中设置 - 先偏移 50% 再回退子元素一半尺寸 | 绝对定位居中设置 )

文章目录一、问题提出二、绝对定位 居中设置1、设置固定尺寸2、先偏移50%再回退固定值三、绝对定位元素 水平 / 垂直 居中一、问题提出 绝对定位 不能通过 设置 margin: auto; 样式的方式 , 设置盒子模型水平居中 ; 相对定位 的 盒子模型 , 并没有脱离标准流限制 , 仍然可以使…

notion插件:为你的工作流带来新生

在本文中,我们将介绍Notion的几款有助于提高生产力的插件。这些插件将加强Notion的功能,并为你的工作流程带来更多的便利。 我们特地为你准备了这本漫游指南:收录各种工具、信息和资源,携你共同探索浩瀚美丽的互联网海洋。 snackt…

23种设计模式-抽象工厂模式

抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创…

数据结构与算法六 树

一 二叉树入门 之前我们实现的符号表中,不难看出,符号表的增删查操作,随着元素个数N的增多,其耗时也是线性增多的,时间复杂度都是O(n),为了提高运算效率,接下来我们学习树这种数据结构。 1.1 树的基本定义…

流程引擎基础知识

流程引擎基础知识流程部署流程取消部署流程发起流程取回流程作废流程委托流程流转常用流程表介绍备注流程部署 1.后台直接导入bpmn /**流程部署源代码*/public void deploy() {ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();RepositoryService repo…

如何使用ChatGPT在1天内完成毕业论文

如何使用ChatGPT在1天内完成毕业论文 几天前,亲眼见证了到一位同学花了1天时间用ChatGPT完成了他的毕业论文,世道要变,要学会使用黑科技才能混的下去。废话到此结束,下面说明这么用AI生成自己的论文。 使用工具: 1. P…

Maven(一):什么是Maven?

Maven(一):什么是Maven?前言一、为什么要学习Maven?1、Maven 作为依赖管理工具1.1 jar 包的规模1.2 jar 包的来源1.3 jar 包之间的依赖关系2、Maven 作为构建管理工具2.1 你没有注意过的构建2.2 脱离 IDE 环境仍需构建…

【ERNIE Bot】百度 | 文心一言初体验

文章目录一、前言二、文心一言介绍三、申请体验⌈文心一言⌋四、⌈文心一言⌋初体验1️⃣聊天对话能力2️⃣文案创作能力3️⃣文字转语音能力✨4️⃣AI绘画能力✨5️⃣数理推理能力6️⃣代码生成能力7️⃣使用技巧说明五、总结一、前言 ​ 最近有关人工智能的热门话题冲上热榜…

亚马逊云科技十七年持续进化,解锁Amazon S3的七项新发布

17年前的3月14日,亚马逊云科技推出了一项“非常简单的”对象存储服务(Amazon Simple Storage Service)。该服务允许开发人员创建、列出和删除私有存储空间(称为存储桶)、上传和下载文件以及管理其访问权限。当时&#…

【C#+Unity小白】制作一款简单的2D平台游戏,PONG(弹球)游戏

素材均来自于Brackeys 各位可以到Youtube支持他,他的视频底下有他个人的网站,各位可以从他拿素材。 像我这样的菜鸡,在我看codeMonkey零零散散的制作视频而不知所措时,Brackeys出现了,他耐心教导,他真的是…

【2023最新】超详细图文保姆级教程:App开发新手入门(1)

1. 关于 『YonBuilder移动开发』 PS: 本段内容主要目的是去除官方语音描述,用通俗的语言来简单介绍一下『YonBuilder移动开发』,方便新手开发者判断是否适合自己上手学习。 简介: YonBuilder移动开发平台(官网:https://develope…

2023年14界蓝桥杯省赛“日期统计”题解

问题描述 小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的范围之内。数组中的元素从左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 …

Python 小型项目大全 41~45

四十一、幸运星 原文:http://inventwithpython.com/bigbookpython/project41.html 在这个碰运气游戏中,你掷骰子来收集星星。你掷得越多,你能得到的星星就越多,但是如果你得到三个头骨,你就失去了一切!这款…

【网络编程】UDP

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 目 录🏯一. UDP数据报套接字编程🏰二. 写一个 UDP 版本的 回显服务器-客户端.(echo server)🏭1. 服务器:&…

咖啡卷到现在,他们开始往里面掺北京豆汁了

咖啡卷到现在,他们开始往里面掺北京豆汁了0. 导读1. 人手一杯,果咖大势所趋2. 双倍成瘾:茶咖和酒咖被重点推荐3. 地方小吃融入咖啡,比如北京豆汁4. 炙手可热的云南咖啡豆5. 咖啡、户外和环保:绑定可持续6. 小结0. 导读…

vue - 【最新】简单快捷的 element ui 组件库的主题色更改,批量统一覆盖替换解决方法,无需npm装包。(适用于新手小白的方法,很简单)

效果图 最新解决方案,简单便捷且不用npm安装任何第三方包就能搞定。 原来的主题色是蓝色 ,可以通过本篇博客提供的方法,统一变成其他主题颜色,比如下面的紫色: 下面就是真实的运行效果,保证可行~ 这样就不用每个组件单独去写样式覆盖颜色了! 定制主

干雾抑尘系统的降尘工作原理

对于干雾抑尘系统,相信大家现在都不陌生,作为工业无组织排放粉尘治理的常用除尘产品,其有着传统喷雾降尘设备无法比拟的优势。今天我们就来了解下,干雾抑尘系统到底是什么?他的工作原理到底是怎样的呢? ​…