java:Java中的类与对象(多态篇)

目录

何为多态

 多态的实现条件

多态特点

继承关系:

方法重写:

父类引用指向子类对象:

运行时类型确定方法调用:

 重写

概念:

注意事项:

 向下转型和向上转型


何为多态

多态的概念:通俗来说,就是多种形态,具体来说,就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

如:打印东西,彩色打印机打印出来的是彩色的,黑白打印机打印出来的是黑白的。

总的来说:同一件事情,发生在不同对象身上,就会产生不同的结果。


 多态的实现条件

在Java中,要实现多态性,需要满足以下条件:

  1. 继承关系:多态性通常是通过父类和子类之间的继承关系实现的。子类可以继承父类的方法,并且可以重写(覆盖)父类的方法。

  2. 方法重写:子类重写(覆盖)父类的方法,即在子类中定义一个与父类相同签名的方法。当使用父类引用指向子类对象时,调用该方法会执行子类中的实现。

  3. 父类引用指向子类对象:利用父类的引用变量指向子类的对象,通过这种方式可以实现多态性。编译时类型是父类,而运行时类型是子类。

  4. 运行时类型确定方法调用:在运行时,根据对象的实际类型确定调用的方法。即使引用变量的编译时类型是父类,但实际上调用的是子类中重写的方法。

 


多态特点

以下是结合具体代码示例,体现每个多态特点的例子:

继承关系:

class Animal {public void eat() {System.out.println("Animal is eating");}
}class Dog extends Animal {@Overridepublic void eat() {System.out.println("Dog is eating");}
}

在这个示例中,Dog类继承自Animal类,形成了继承关系。

方法重写:

class Shape {public void draw() {System.out.println("Drawing a shape");}
}class Circle extends Shape {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}

在这个示例中,Circle类重写了Shape类中的()draw()方法。

父类引用指向子类对象:

Shape shape = new Circle();

这行代码中,shape是Shape类的引用,但指向了Circle类的对象,实现了父类引用指向子类对象的特点。

运行时类型确定方法调用:

Shape shape = new Circle();
shape.draw();

在这个示例中,即使shape的编译时类型是Shape,但在运行时确定调用的是Circle类中重写的()draw()方法。


 重写

概念:

当子类重写(覆盖)父类的方法时,子类可以提供自己的实现,从而改变父类方法的行为。这是多态性的一个重要概念。以下是一个示例代码,演示了重写方法时多态性的应用:

class Animal {public void makeSound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");}
}class Cat extends Animal {@Overridepublic void makeSound() {System.out.println("Cat meows");}
}public class Main {public static void main(String[] args) {Animal animal1 = new Dog();Animal animal2 = new Cat();animal1.makeSound(); // 输出:Dog barksanimal2.makeSound(); // 输出:Cat meows}
}

注意事项:

  • 方法签名必须一致:

在重写方法时,子类的方法签名(方法名称、参数列表和返回类型)必须与父类中被重写的方法完全一致。否则,编译器将视其为新的方法而不是重写方法。

  • 访问修饰符:

子类中重写的方法的访问修饰符不能比父类中被重写方法的访问修饰符更严格。例如,父类中的方法是public,则子类中重写的方法不能是protected或private。

  • 异常:

子类中重写的方法不能抛出比父类中被重写方法更宽泛的异常。如果父类方法抛出异常,子类重写的方法可以不抛出异常,但不能抛出更宽泛的异常。

  • super关键字:

在子类中重写父类方法时,可以使用super关键字调用父类的被重写方法,以便在子类中添加额外的功能而不完全覆盖父类方法。

  • final方法:

不能重写父类中被声明为final的方法。final方法表示该方法不能被子类重写。

  • 静态方法:

静态方法不能被重写,因为静态方法与类相关联,而不是与对象相关联。子类中可以定义与父类中静态方法同名的静态方法,但不会构成重写。

  • 构造方法:

构造方法不能被重写,因为构造方法是用于创建对象的特殊方法,而不是普通的成员方法。


 向下转型和向上转型

假设我们有以下的类结构:

class Animal {public void makeSound() {System.out.println("Animal makes a sound");}
}class Dog extends Animal {@Overridepublic void makeSound() {System.out.println("Dog barks");}public void fetch() {System.out.println("Dog fetches a ball");}
}

现在我们来演示向上转型和向下转型:

public class Main {public static void main(String[] args) {// 向上转型Animal animal = new Dog(); // 将子类对象赋值给父类引用animal.makeSound(); // 输出:Dog barks// animal.fetch(); // 编译错误,Animal 类型没有 fetch() 方法// 向下转型if (animal instanceof Dog) {Dog dog = (Dog) animal; // 将父类引用强制转换为子类引用dog.fetch(); // 输出:Dog fetches a ball}}
}

在上面的示例中,我们首先进行了向上转型,将一个Dog对象赋值给一个Animal引用。虽然我们使用的是Animal引用,但实际上调用的是Dog类中重写的makeSound()方法。在向上转型后,我们无法直接调用Dog类特有的方法fetch(),因为Animal类型没有这个方法。

然后,我们进行了向下转型。在进行向下转型之前,我们使用instanceof关键字来检查对象是否是Dog类的实例,以避免ClassCastException异常。如果对象是Dog类的实例,我们就将Animal引用强制转换为Dog引用,这样就可以调用Dog类特有的方法fetch()。


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

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

相关文章

linux mount挂载终结方案,测试好再重启

一、背景 不懂挂载,又担心改写了配置而开不了及机,这篇文章给你信心 用 sudo mount -a 测试 二、原理 1、先用命令在终端确认三可以挂载 2、改写配置文件 /etc/fstab 三、步骤 1、列出可以挂载的 fdisk -l dev/sda1 2048 616447 6…

JavaScript教程(十六) --- 元编程

元编程 Proxy 和 Reflect 对象允许你拦截并自定义基本语言操作(例如属性查找、赋值、枚举和函数调用等)。借助这两个对象,你可以在 JavaScript 进行元级别的编程。 代理 Proxy 对象可以拦截某些操作并实现自定义行为。 例如获取一个对象上…

大数据建模理论

文章目录 一、数仓概述1、数据仓库概念1.1 概述1.2 数据仓库与数据库的区别1.3 技术选型和架构 2、数仓常见名词2.1 实体2.2 维度2.3 度量2.4 粒度2.5 口径2.6 指标2.7 标签2.8 自然键/持久键/代理键2.9 退化维度2.10 下钻/上卷2.11 数据集市 3、数仓名词之间关系3.1 实体表&am…

java-javafx在普通类里如何弹出javafx的弹窗或者窗口

java-javafx在普通类里如何弹出javafx的弹窗或者窗口 背景代码运行报错解决方法总结参考 背景 想要在一个普通类里弹出一个弹窗 代码 package sample.main;import javafx.application.Application; import javafx.application.Platform; import javafx.embed.swing.JFXPanel…

Spring 事务失效总结

前言 在使用spring过程中事务是被经常用的,如果不小心或者认识不做,事务可能会失效。下面列举几条 业务代码没有被Spring 容器管理 看下面图片类没有Componet 或者Service 注解。 方法不是public的 Transactional 注解只能用户public上&#xff0c…

李沐41_物体检测和数据集——自学笔记

边缘框 1.一个边缘框可以通过4个数字定义(左上xy,右上xy,左下xy,右下xy) 2.标注成本高 目标检测数据集 1.每行表示一个物体(图片文件名、物体类别、边缘框) 2.COCO:80物体、330…

RAG原理详解

什么是RAG 检索增强生成(Retrieval Augmented Generation,简称RAG)为大型语言模型(LLMs)提供了从某些数据源检索到的信息,以此作为生成答案的基础。简而言之,RAG是搜索LLM提示的结合&#xff0…

Mac用户必备神器:Default Folder X,让文件操作更快捷、更智能!

Default Folder X for Mac是一款功能强大的文件管理辅助工具,它为Mac用户带来了前所未有的文件操作体验。🌟 无论是日常办公、学习还是娱乐,Default Folder X都能帮助你更高效地管理文件,让你的工作更加得心应手。💼 …

AD高速板设计(笔记)

Alt左键高亮某个器件或属性,点击任意位置取消高亮。 TP设置旋转角度为45度,即可选中器件按空格旋转时候每次旋转45度。 先画出想要割槽的区域,选中之后TVB即可开槽。 左右翻转电路板:VB DR打开规则设置 UFO对器件进行扇出&#…

Linux系统部署可视化数据多维表格APITable并实现无公网IP远程协同办公

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-G5XdKx1vxX0o0PES {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

PHP回显语句详解

PHP中的回显语句是一种常见的输出数据到前端的方法,广泛应用于网页开发中。本文将深入探讨PHP中回显语句的各个方面,包括其基本用法、不同的回显方法、与其他语句的比较、性能考量以及一些高级用法和技巧。 1. 回显语句的基本用法 在PHP中,…

AVM 环视拼接方法介绍

0. 简介 关于车辆的全景环视系统网上已经有很多的资料,然而几乎没有可供参考的代码,这一点对入门的新人来说非常不友好。全景环视系统,又称AVM。在自动驾驶领域,AVM属于自动泊车系统的一部分,是一种实用性极高、可大幅…

面试题总结:HashMap底层原理

不仅仅是一道题,之后的某一天,它可能是破局的关键。 关于HashMap的知识点有哪些呢?分层次展示 1.基础知识: 存储键值对结构、底层数据结构、红黑树和链表 2.位运算与实现 位运算、put、get方法的实现 3.关于锁 segment锁和桶锁、线…

python给图片改名

在Python中,你可以使用os库来遍历一个目录中的所有文件,并使用os.rename()函数来重命名它们。以下是一个简单的示例,该示例会将当前目录下的所有.jpg文件重命名为new_name_1.jpg,new_name_2.jpg,等等。 import os# 获…

Java 中 Set 集合是如何实现添加元素保证不重复的?

Java 中的 Set 集合是一种不允许包含重复元素的集合。它主要通过两种方式来实现确保元素不重复的机制:一是依赖元素的 hashCode() 方法和 equals() 方法,二是底层数据结构的支持。 1. hashCode() 和 equals() 方法 在 Java 中,每个对象都有…

【服务器配置】docker环境配置

docker环境配置 本文是在ubuntu 22.04机器配置docker环境 查看系统的内核版本 uname -a Linux xxf-ThinkStation-P340 5.15.0-101-generic #111-Ubuntu SMP Tue Mar 5 20:16:58 UTC 2024 x86_64 x86_64 x86_64 GNU/Linuxx86 64位 系统 如果是32位 不能安装docker 更新软件…

分布式数据库Polardb-X架构及特点

PolarDB-X架构 计算节点(Compute Node,CN)是系统的入口,采用无状态设计的sql引擎提供分布式路由和计算,包括SQL解析器、优化器、执行器等模块。负责数据分布式路由、计算及动态调度,负责分布式事务2PC协调…

基于java+springboot+vue实现的学生信息管理系统(文末源码+Lw+ppt)23-54

摘 要 人类现已进入21世纪,科技日新月异,经济、信息等方面都取得了长足的进步,特别是信息网络技术的飞速发展,对政治、经济、军事、文化等方面都产生了很大的影响。 利用计算机网络的便利,开发一套基于java的大学生…

文献学习-37-动态场景中任意形状针的单目 3D 位姿估计:一种高效的视觉学习和几何建模方法

On the Monocular 3D Pose Estimation for Arbitrary Shaped Needle in Dynamic Scenes: An Efficient Visual Learning and Geometry Modeling Approach Authors: Bin Li,† , Student Member, IEEE, Bo Lu,† , Member, IEEE, Hongbin Lin, Yaxiang Wang, Fangxun Zhong, Me…

PHP01——php快速入门 之 在Mac上使用phpstudy快速搭建PHP环境

PHP01——php快速入门 之 在Mac上使用phpstudy快速搭建PHP环境 0. 前言1. 下载小皮面板1.1 下载phpstudy(小皮面板)1.2 启动、简单访问1.2.1 启动Apache1.2.2 访问1.2.3 访问自定义文件或页面 2. 创建网站2.1 创建网站2.2 可能遇到的问题2.2.1 hosts权限…