Java多态的理解

目录

一、什么是多态

二、多态实现的条件

三、实例分析

四、多态应用之一(多态数组)

五、多态参数


一、什么是多态

在Java中,多态是面向对象编程中的一个重要概念,它允许不同类型的对象对同一方法进行不同的实现。具体来说,多态性是指的是通过父类的引用变量来引用子类的对象,从而实现对不同对象的统一操作。

二、多态实现的条件

1.继承关系

存在继承关系的类之间才能够使用多态性。多态性通常通过一个父类的引用指向子类的对象。

2.方法重写

子类必须重写(override)父类的方法。通过在子类中重新定义和实现父类的方法,可以根据子类的特点行为改变这个方法的行为。

3.父类引用指向子类对象

使用父类的引用变量来引用子类对象。这样可以实现对不同类型的对象的统一操作,而具体调用哪个子类的方法会在运行时多态决定。

三、实例分析

public class JiCheng {public static void main(String[] args) {Animal animal = new Cat();animal.eat();}
}class Animal {void eat() {System.out.println("动物捕食");}
}class Cat extends Animal {@Overrideprotected void eat() {System.out.println("小猫吃鱼");}
}class Dog extends Animal {@Overridepublic void eat() {System.out.println("小狗吃骨头");}
}

首先要明白,多态是针对方法的来说的

我们看,Cat类和Dog类继承自Animal类,并重写了eat方法。常说的“编译看左边,运行看右边”是说,animal作为父类的引用,它能调用的方法在编译时就已经确定了,它作为父类的引用,父类的所有方法,都可调用。运行看右边,是指,运行时,具体的方法,是看到底animal是什么类型的对象,上例可知,animal本质是Cat类的对象,所以实际效果是调用Cat类的方法。如果说,Cat类没有重写父类方法,则向上调用父类的方法。

这里涉及到Java的动态绑定,父类对象的引用绑定子类方法

对于子类中一些特有的方法,我们要让他回归本源,也就是强制转换为Cat,回归自我,右边类型是Cat类,左边也是Cat类引用接收,这里注意:我们只能强转父类的引用,不能强转父类对象,还有,不能强转为Dog,因为它本质是Cat类。

如果是,调用属性:则父类引用调用的是父类的属性,属性没有多态一说;

public class JiCheng {public static void main(String[] args) {Animal animal = new Cat();animal.eat();Cat cat = (Cat) animal;cat.jiao();}
}class Animal {void eat() {System.out.println("动物捕食");}
}class Cat extends Animal {void jiao() {System.out.println("miaomiaomiao~");}@Overrideprotected void eat() {System.out.println("小猫吃鱼");}
}

四、多态应用之一(多态数组)

public class DuoTaiShuZu {public static void main(String[] args) {Person[] people = new Person[5];people[0] = new Person();people[1] = new Teacher();people[2] = new Student();for (int i = 0; i < 5; i++) {if (people[i] instanceof Person) {people[i].say();} else if (people[i] instanceof Student) {Student person = (Student) people[i];person.study();} else if (people[i] instanceof Teacher) {((Teacher) people[i]).teach();}}}}class Person {String name;int age;void say() {System.out.println("人类可互相交流");}
}class Teacher extends Person {@Overridevoid say() {System.out.println("老师说要好好学习");}void teach() {System.out.println("老师教学生");}
}class Student extends Person {@Overridevoid say() {System.out.println("学生说要适当放松");}void study() {System.out.println("学生学知识");}
}

五、多态参数

方法定义形参为父类类型,实参允许为子类类型;

public class Test1 {public static void main(String[] args) {Test1 test1 = new Test1();Student student = new Student();Teacher teacher = new Teacher();test1.shitang(student);test1.shitang(teacher);}void shitang(Person a) {if (a instanceof Teacher) {((Teacher) a).teach();return;}a.eat();}
}class Person {void eat() {System.out.println("是个人就要吃饭");}
}class Student extends Person {@Overridepublic void eat() {System.out.println("学生在学生食堂吃饭");}void study() {System.out.println("学生上课");}
}class Teacher extends Person {@Overridepublic void eat() {System.out.println("老师在员工食堂吃饭");}void teach() {System.out.println("老师教书");}
}

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

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

相关文章

Kaggle网站免费算力使用,深度学习模型训练

声明&#xff1a; 本文主要内容为&#xff1a;kaggle网站数据集上传&#xff0c;训练模型下载、模型部署、提交后台运行等教程。 1、账号注册 此步骤本文略过&#xff0c;如有需要可以参考其他文章。 2、上传资源 不论是上传训练好的模型进行预测&#xff0c;还是训练用的…

如何提升美国Facebook直播的整体体验?

Facebook作为全球最大的社交媒体平台之一&#xff0c;提供了直播功能&#xff0c;用户可以实时分享生活、见解和创意。许多商家通过美国Facebook直播来获取更多客户&#xff0c;但直播时可能会遇到网络卡顿的问题&#xff0c;导致观看体验不佳。本文将探讨如何解决这个问题&…

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码&#xff1a; 新建主图幅图类型指标都可以&#xff01; VAR1:(HL)/2; 唇:REF(SMA(VAR1,5,1),3),COLORGREEN; 齿:REF(SMA(VAR1,8,1),5),COLORRED; 颚:REF(SMA(VAR1,13,1),8),COLORBLUE;

C++规范

一、VS工具集列表&#xff1a; Visual Studio 2008&#xff1a;v90 Visual Studio 2010&#xff1a;v100 Visual Studio 2012&#xff1a;v110 Visual Studio 2013&#xff1a;v120 Visual Studio 2015&#xff1a;v140 &#xff08;v140_xp&#xff09; Visual Studio 2017&a…

FinClip SDK 入驻鸿蒙生态伙伴市场,激发鸿蒙应用创新活力

华为近期宣布开放“鸿蒙生态伙伴SDK市场”&#xff0c;甄选各类优质、安全的SDK加入聚合平台&#xff0c;致力于帮助各行业开发者轻松、高效地打造鸿蒙原生应用。 目前&#xff0c;已有18个领域、超过350个SDK适配HarmonyOS NEXT版本&#xff0c;并有超过120个SDK完成上架发布…

【Linux Git入门】Git的介绍

文章目录 前言git简介git是什么git的作用为什么要学习git安装git总结前言 在现代软件开发中,版本控制系统已经成为了不可或缺的工具。其中,Git是最受欢迎的版本控制系统之一。Git是由Linux的创造者Linus Torvalds在2005年创建的,用于管理Linux内核的开发。Git是一个分布式版…

const 修饰不同内容区分

1.修饰局部变量 const int a 1;int const a 1; 这两种是一样的 注意&#xff1a; const int b; 该情况下编译器会报错&#xff1a;常量变量"b”需要初始值设定项 将一个变量没有赋初始值直接const修饰后&#xff0c;在以后时无法更改内容的。 2.修饰常量字符串 a.…

智享AI自动直播系统:打造独一无二的属于你自己的AI主播

随着科技的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到了我们生活的方方面面。其中&#xff0c;AI自动直播系统作为新兴的技术应用&#xff0c;正逐渐改变着传统直播行业的格局。本文将深入探讨智享AI自动直播系统的优势&#xff0c;以及它如何帮助…

哪些算法会使用最大似然估计

逻辑回归&#xff08;Logistic Regression&#xff09;&#xff1a; 逻辑回归通过最大化似然函数来估计模型参数&#xff0c;使得观察到的数据最有可能由模型生成。 朴素贝叶斯分类器&#xff08;Naive Bayes Classifier&#xff09;&#xff1a; 朴素贝叶斯使用贝叶斯定理&…

Laravel - laravel-websockets 开发详解

1.我laravel-websockets 的开发环境 Laravel 9.0Laravel WebSockets &#xff08;最新版&#xff09;Laravel Vite 2. 安装服务器端包 beyondcode/laravel-websockets 运行以下命令安装laravel-websockets composer require beyondcode/laravel-websockets 安装完后&#…

【Linux命令入门】查找文件

文章目录 前言whichlocatewhereisfindgrep总结前言 在日常的Linux使用中,我们经常需要查找文件,无论是为了找到某个特定的配置文件,还是为了找到某个丢失的文档。Linux提供了一些强大的命令行工具,可以帮助我们在系统中查找文件。这些工具包括find,locate,which,wherei…

「树莓派入门」树莓派进阶02-传感器应用与交通灯项目

传感器是树莓派实现智能化的关键。通过本教程,你可以开始尝试使用传感器来增强树莓派的功能。 一、传感器在树莓派中的作用 传感器是树莓派与外界环境交互的重要工具。它们可以检测各种物理量,如光、声音、温度等,并将这些物理量转换为电信号,供树莓派读取和处理。 二、数…

C++ Linux调试(无IDE)

跨平台IDE编译调试C很方便&#xff0c;如QTCreate 、VSCode、Eclipse等&#xff0c;但是如果只能使用Shell控制台呢&#xff0c;gdb调试的优势就很明显了&#xff0c;在没有IDE的情况下&#xff0c;这个方式最有效。因为上手不是很难&#xff0c;特此整理 参考链接 目录 1、G…

光伏项目开发合作模式

光伏项目开发合作模式多种多样&#xff0c;根据应用场景的不同&#xff0c;主要分为户用光伏项目合作模式和工商业光伏项目合作模式。本文将分别介绍这两种模式的特点和常见形式&#xff0c;帮助大家更好地了解光伏项目开发的市场运作。 一、户用光伏项目合作模式 1.用户全款购…

笔记本电脑内存不够

笔记本电脑内存不够是众多笔记本用户面临的常见问题&#xff0c;尤其是对于一些需要处理大型文件或者运行复杂软件的用户&#xff0c;这个问题可能会严重影响笔记本的使用体验。那么&#xff0c;我们应该如何解决笔记本电脑内存不够的问题呢&#xff1f;本文将从几个方面进行详…

2024年6月118篇代码大模型论文最全整理

引言 本文整理了2024年6月全球各大高校与科研机构发布的118篇代码大模型相关论文。根据论文内容&#xff0c;我们将其整理为基座模型与训练数据、代码微调、测试基准、代码Agent、低资源语言处理、AI代码安全与分析、人机交互、软件工程下游任务应用&#xff08;包括代码生成、…

基于B/S架构+java语言+ 开发工具Idea,vscode医院产科信息管理系统源码 如何标准化对接技术及各个模块

基于B/S架构java语言 开发工具Idea,vscode医院产科信息管理系统源码 如何标准化对接技术及各个模块 医院产科信息管理系统&#xff1a;标准化对接是一个涉及多个方面的复杂过程&#xff0c;旨在通过数字化手段提升产科管理的效率与质量&#xff0c;实现孕产妇全周期的健康管理…

获取JWT的token生成时间和过期时间

我用的依赖包如下 <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.2.0</version></dependency>token生成时间 Date issuedAt jwt.getIssuedAt(); // 将Date转换为Instant Instant c…

【9-2:代码规范】

算法级思想 代码规范&#xff08;java&#xff09; 代码规范&#xff08;java&#xff09; 方法参数必须一致&#xff0c;不要出现自动装箱拆箱操作SimpleDateFormat是线程不安全的使用equals注意空指针异常日志 事务场景中如果出现异常被捕时注意回滚不要再finally中使用retu…

字节码编程javassist之增加异常捕获

写在前面 本文看下如何增加try catch异常捕获。 1&#xff1a;程序 需要增强的类&#xff1a; public class ApiTest1 {public Integer strToInt(String str01, String str02) {return Integer.parseInt(str01);}}插桩类 package com.dahuyou.javassist.huohuo.aa;import …