当前位置: 首页 > news >正文

Java基础(十四)面向对象编程 OOP 多态

Java面向对象基础知识笔记(四)


1. 对象数组的使用

在Java中,我们可以创建包含对象的数组。对象数组是一种特殊类型的数组,其中每个元素都是一个对象的引用。你可以将任何类的对象存储在对象数组中,并通过索引来访问和操作这些对象。

以下是对象数组的基本用法:

// 创建对象数组
ClassName[] arrayName = new ClassName[size];// 实例化对象并存储到数组中
arrayName[index] = new ClassName();// 访问对象数组中的元素
ClassName obj = arrayName[index];// 修改对象数组中的元素
arrayName[index].propertyName = value;

例如,我们可以创建一个Person类的对象数组:

class Person {String name;int age;
}public class Main {public static void main(String[] args) {// 创建对象数组Person[] people = new Person[3];// 实例化对象并存储到数组中people[0] = new Person();people[0].name = "Alice";people[0].age = 25;people[1] = new Person();people[1].name = "Bob";people[1].age = 30;people[2] = new Person();people[2].name = "Charlie";people[2].age = 35;// 访问对象数组中的元素System.out.println("Name: " + people[0].name + ", Age: " + people[0].age);System.out.println("Name: " + people[1].name + ", Age: " + people[1].age);System.out.println("Name: " + people[2].name + ", Age: " + people[2].age);}
}

2. 使用对象作为方法的参数

在Java中,我们可以将对象作为方法的参数传递。这对于需要传递多个相关数据的情况非常有用。通过将对象作为参数传递给方法,我们可以方便地访问和操作该对象的属性。

以下是使用对象作为方法参数的示例:

class Person {String name;int age;
}public class Main {public static void printPersonInfo(Person person) {System.out.println("Name: " + person.name + ", Age: " + person.age);}public static void main(String[] args) {Person person = new Person();person.name = "Alice";person.age = 25;// 调用方法,并传递对象作为参数printPersonInfo(person);}
}

3. 向上转型和向下转型

1. 向上转型(Upcasting)

向上转型是指将子类类型的引用赋值给父类类型的引用。它是一种隐式的类型转换,在继承关系存在的情况下可以自动进行。

调用实例方法是,要看是哪个对象调用的就执行哪个方法,调用 static 方法时,调用的是父类方法(静态方法属于类)实例方法看等号右边,静态方法看等号左边

例如,如果有一个Cat类继承自Animal类,那么可以将Cat对象向上转型为Animal类型:

Cat cat = new Cat();
Animal animal = cat; // 向上转型

这里,cat对象被视为Animal对象,因为Cat继承自Animal,可以访问和操作Animal类的属性和方法。

2. 向下转型(Downcasting)

向下转型是指将父类类型的引用赋值给子类类型的引用。它是一种显式的类型转换,需要使用强制类型转换符()来进行。

在进行向下转型之前,应先使用instanceof运算符进行类型检查,以确保转型是安全的。

  • 使用 instanceof 时,对象的类型必须和 instanceof 后面的参数所指定的类有继承关系,否则会出现编译错误。
  • java16 的增强之后,对于 instanceof 的判断以及类型转换可以合二为一,如下:
if (pet instanceof Dog dog) {dog.catchingFlyDisc();
}
if (pet instanceof Brid bird) {brid.fly();
}

以下是一个向下转型的示例:

Animal animal = new Cat(); // 向上转型
Cat cat;if (animal instanceof Cat) { // 类型检查cat = (Cat) animal; // 向下转型// 访问和操作Cat类特有的属性和方法
}

在这个示例中,我们首先将Cat对象向上转型为Animal类型,然后使用instanceof检查animal是否为Cat类型。如果是,就可以进行向下转型,并访问和操作Cat类特有的属性和方法。

多态


多态是面向对象编程的重要概念之一。它允许我们使用父类类型的引用来引用子类类型的对象,从而实现不同对象的统一处理。方法重写是实现多态的基础

多态有两种形式:编译时多态(静态多态)和运行时多态(动态多态)。

  • 编译时多态(重载):在编译阶段根据方法的参数类型和数量来决定调用哪个方法。多个同名方法通过参数列表来区分。例如,重载的print()方法可以接受不同类型的参数,并根据参数类型的不同执行不同的代码逻辑。
class Printer {public void print(String str) {System.out.println("Printing string: " + str);}public void print(int num) {System.out.println("Printing number: " + num);}
}public class Main {public static void main(String[] args) {Printer printer = new Printer();printer.print("Hello");printer.print(123);}
}
  • 运行时多态(重写):在程序运行时根据对象的实际类型来决定调用哪个方法。子类可以重写(覆盖)父类的方法,并改变其行为。通过使用父类类型的引用来引用子类类型的对象,可以实现多态。
class Animal {public void makeSound() {System.out.println("Animal is making a sound");}
}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Cat is meowing");}
}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog is barking");}
}public class Main {public static void main(String[] args) {Animal animal1 = new Cat(); // 向上转型Animal animal2 = new Dog(); // 向上转型animal1.makeSound(); // 调用Cat类的makeSound方法animal2.makeSound(); // 调用Dog类的makeSound方法}
}

在上面的示例中,我们创建了Animal类的两个子类CatDog。通过向上转型将它们分别赋值给Animal类型的引用animal1animal2。然后,通过调用makeSound()方法,可以实现多态,具体执行哪个子类的方法由实际对象决定。

总结一下,多态允许我们根据上下文和对象的实际类型来选择合适的方法,提高代码灵活性和可复用性。根据用到的不同对象类型,响应不同的操作。

相关文章:

Java基础(十四)面向对象编程 OOP 多态

Java面向对象基础知识笔记(四) 1. 对象数组的使用 在Java中,我们可以创建包含对象的数组。对象数组是一种特殊类型的数组,其中每个元素都是一个对象的引用。你可以将任何类的对象存储在对象数组中,并通过索引来访问和操…...

【Android】解决Lint found fatal errors while assembling a release target

报错信息: Android在debug模式下打包没有问题,但是在打包release版本时出现一下问题: 结果图 原因 我项目的原因是因为把正式、测试地址放到代码里了,忘记选中正式环境的地址,导致打正式包有问题;大家如果…...

CF1195E OpenStreetMap 题解

很好的单调队列题。 题目传送门 题目意思: 给定一个 n m n\times m nm 的矩阵,求出所有大小为 a b a\times b ab 的子矩形中的最小值的和。 思路: 通过题目给的要求建立二维数组 h h h。通过单调队列一行一行地扫,将扫出来…...

微信营销系统如何使用效果会更好

微信作为中国最大的社交平台之一,已经成为企业私域营销的重要阵地。在这个庞大的社交网络中,如何使用微信营销系统,将直接影响到企业的营销效果。本文将深入探讨如何更好地利用微信营销系统,以实现更好的私域营销效果。 1. 确定营…...

Linux开机启动程序添加root权限

Linux添加开机启动程序 Debain、Ubuntu系列Linux开机之后会执行/etc/rc.local文件中的命令,所以,如果是想添加登陆用户所具有权限的操作,可以在文件中exit 0之前添加开机自动执行的脚本命令。或者将执行脚本的权限修改为当前登录用户具有执行…...

安卓13解决链接问题

作为Android用户,你可能已经注意到了一个问题——Android 13不再支持PPTP协议。但请别担心,作为一家专业的代理供应商,我们将与你分享解决方案,让你轻松解决L2TP问题,享受到高水平的连接体验。本文将为你提供实用的操作…...

​《乡村振兴战略下传统村落文化旅游设计 》在2023年畅销榜排名465位

​《乡村振兴战略下传统村落文化旅游设计 》在2023年畅销榜排名465位...

实现一个自动保存高CPU占用现场的简易工具

CPU 使用率在系统监控中是一个非常重要的指标。对于大多数 Web 应用来说,它们往往是 IO 密集型的,因此只会在某些时刻可能会出现 CPU 突然飙升的情况,随后很快就恢复正常。然而,当收到报警并想要排查问题时,CPU 飙升的…...

易服客工作室:如何在WordPress网站中举办虚拟活动

您是否正在寻找举办和管理虚拟活动的最佳方式? 也许您想在线举行下一次会议或举办有关您的产品和服务的网络研讨会。您可能担心它太贵,或者您没有技术知识来实现​​它。 在本文中,我们将列出您所需的在线服务的所有设备,并教您…...

Java IO流(一)IO基础

概述 IO流本质 I/O表示Input/Output,即数据传输过程中的输入/输出,并且输入和输出都是相对于内存来讲Java IO(输入/输出)流是Java用于处理数据读取和写入的关键组件常见的I|O介质包括 文件(输入|输出)网络(输入|输出)键盘(输出)显示器(输出)使用场景 文件拷贝(File&…...

区间覆盖 线段覆盖 二分

4195. 线段覆盖 - AcWing题库 P2082 区间覆盖&#xff08;加强版&#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 做法&#xff1a; void solve() {int n; cin>>n;vector<array<LL,2>> seg(n);for(auto &t: seg) cin>>t[0]>>…...

F#奇妙游(20):主动模式

F#中主动模式的三种形式 F#中有一种特殊的模式匹配&#xff0c;叫做主动模式&#xff08;Active Pattern&#xff09;。主动模式可以让我们自定义模式匹配的方式&#xff0c;这样可以让我们的代码更加简洁&#xff0c;更加清晰。主动模式有三种形式&#xff0c;分别是&#xf…...

OLED透明屏与传统显示屏的区别:探索未来视觉体验的新里程碑

OLED透明屏作为一种新兴的显示技术&#xff0c;与传统显示屏相比&#xff0c;具有许多独特的特点和优势。 那么&#xff0c;在这篇文章中&#xff0c;尼伽便通过比较OLED透明屏和传统显示屏的区别&#xff0c;包括透明性、对比度、色彩表现力、节能环保等方面&#xff0c;为读…...

打开软件提示mfc100u.dll缺失是什么意思?要怎么处理?

当你打开某个软件或者运行游戏&#xff0c;系统提示mfc100u.dll丢失&#xff0c;此时这个软件或者游戏根本无法运行。其实&#xff0c;mfc100u.dll是动态库文件&#xff0c;它是VS2010编译的软件所产生的&#xff0c;如果电脑运行程序时提示缺少mfc100u.dll文件&#xff0c;程序…...

Python 基础 -- Tutorial(二)

5、数据结构 本章更详细地描述了一些你已经学过的东西&#xff0c;并添加了一些新的东西。 5.1. 更多关于Lists 列表(list)数据类型有更多的方法。下面是列表对象的所有方法: list.append(x) 在列表末尾添加一项。相当于a[len(a):] [x]。 list.extend(iterable) 通过添加可…...

11 迭代器|生成器|协程

文章目录 迭代器可迭代对象可迭代对象的本质iter()函数与 next()函数迭代器 Iterator样例 for...in...循环的本质使用的场景--斐波那契数列list和tuple也可以接收可迭代对象 生成器简介创建生成器方法一方法二总结 使用 send 唤醒 协程协程和线程差异简单实现协程greenletgeven…...

“第三方支付”详解!

第三方支付是什么&#xff1f;第三方支付的解释 中央银行官方解释&#xff1a;是与产品所在国和主要外资银行签订合同、具有一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台进行的交易中&#xff0c;买方购买货物后&#xff0c;买方使用第三方平台…...

Rust之泛型、trait与生命周期

泛型是具体类型或其他属性的抽象替代。在编写代码时&#xff0c;可以直接描述泛型的行为&#xff0c;或者它与其他泛型产生的联系&#xff0c;而无须知晓它在编译和运行代码时采用的具体类型。 1、泛型数据类型&#xff1a; 们可以在声明函数签名或结构体等元素时使用泛型&am…...

GPU Microarch 学习笔记 [1]

WARP GPU的线程从thread grid 到thread block&#xff0c;一个thread block在CUDA Core上执行时&#xff0c;会分成warp执行&#xff0c;warp的颗粒度是32个线程。比如一个thread block可能有1024个线程&#xff0c;分成32个warp执行。 上图的CTA&#xff08;cooperative thre…...

Transformer(一)简述(注意力机制,NLP,CV通用模型)

目录 1.Encoder 1.1简单理解Attention 1.2.什么是self-attention 1.3.怎么计算self-attention 1.4.multi-headed&#xff08;q&#xff0c;k&#xff0c;v不区分大小写&#xff09; 1.5.位置信息表达 2.Decoder&#xff08;待补充&#xff09; 3.BERT 参考文献 1.Encode…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...