当前位置: 首页 > 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…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...