首页 > 编程语言 >[JAVA] 什么是多态?多态的使用和代码实现(超详细版)

[JAVA] 什么是多态?多态的使用和代码实现(超详细版)

时间:2024-08-14 10:24:07浏览次数:9  
标签:JAVA 子类 代码 多态 Cat Animal 父类 eat

理解多态

在JAVA中,多态是面向对象编程的重要特征之一,多态意味着在程序中同一个行为具有多种不同的表现形式。

为了更好的理解多态的含义和使用方法,我们可以利用生活中的例子来帮助我们学习

比如一些动物们都有跑,跳,吃等等的通用行为能力,不同的动物针对这些行为的表现形式是不同的

比如狗狗,猫猫,小鸭子他们喜欢吃的东西各有不同,他们的叫声也是不一样的

再比如,当我们按下键盘当中的F1键,针对工作窗口的不同,它也会显示不同的窗口文档

如果在Eclipse编译器下,按下F1键,弹出的是eclipse下的帮助手册

如果在word文档下按下F1键,弹出的是word下的帮助手册

总结:同样的一种行为,在不同的对象上会产生不同的形式结果,这就是生活当中的多态 

而在程序设计当中,意味着允许不同类的对象对同一消息做出不同的响应

JAVA中多态

多态可以分为 编译时多态 和 运行时多态

编译时多态又称设计时多态,指编译器在编译状态就可以进行不同行为的区分,通常我们这种方式是通过方法的重载

运行时多态指的是JAVA程序运行的时,系统才能根据调用方法实例的类型来去决定具体调用哪一个方法

我们一般在JAVA程序中说到的多态,大多指的是运行时多态。

多态实现的两个必要条件:

                    — 满足继承关系

                    — 父类引用指向子类对象

在代码中描述多态功能:

我们可以在开发工具中建立代码块,来向大家讲解多态的具体实现    

以编写动物类代码块为例:

父类Animal:

package Test;

public class Animal {

//动物姓名,月份

private String name;
private int month;

// 方法:吃东西

public  void eat() {
	System.out.println("动物都有吃东西的属性");
}
}

子类Cat:

package Test;

public class Cat extends Animal {
	//属性:体重
   private double weight;
   


//方法:跑动
public void run() {
	System.out.println("小猫爱奔跑");
}

//方法:吃东西(重写父类方法)
public void eat() {
	System.out.println("小猫爱吃鱼");
}

}

子类Dog:

package Test;

public class Dog extends Animal {
	//属性:性别
private String sex;
   
//方法:吃东西
public void eat() {
	   System.out.println("小狗爱吃翔");
   }

//方法:睡觉
   public void sleep() {
	   System.out.println("小狗爱赖床");
   }
}

测试Test类:

package com.ww.test;

import Test.Animal;
import Test.Cat;
import Test.Dog;

public class Test {
	public static void main(String[] args) {
		Animal one=new Animal();//创建引用
		Animal two=new Cat();  //创建引用,指向子类Cat
		Animal three=new Dog();//创建引用,指向子类Dog
	
        //调用共有eat方法,看有什么区别
		one.eat();
		two.eat();
		three.eat();
	}

}

运行显示结果:

从以上代码我们可以得出,以上三个类中都含有eat方法,都是表示吃这一行为,同样是Animal类型的引用

但是随着在具体的运行时,实例化对象的不同,他们的执行结果是不一样的,这就是在JAVA中多态的表现形式

向上转型  (又称隐式转型,自动转型)
  • 我们通过将子类对象向上转型为父类类型,可以用父类类型的变量来引用不同子类的对象。这样,在编写代码时,可以基于父类的通用接口进行操作。
  • 子类对象可以在任何需要父类对象的地方使用,保证了代码的正确性和稳定性。
  • 避免了为每个子类都编写重复的逻辑,减少了代码冗余。

它在代码中的表现形式是;            — — 父类引用指向子类实例

       在这里我们把父类看作一个大类,子类看作是父类当中的特定类型,也就是小类的话,那么向上转型就是由小类转大类

Animal one=new Animal();

当我们完成子类向父类转型后,我们就可以调用子类重写父类的方法 或父类派生的能被子类继承的方法

Animal one=new Animal();
Animal two=new Cat();


one.eat( );     //子类重写父类方法
one.setMonth(2); //父类派生,能被子类继承
one.getMonth();  

注:向上转型不可以调用子类独有方法

向下转型(强制类型转换)

  • 当通过父类引用无法直接调用子类特有的方法和属性时,需要进行向下转型来实现。例如,子类中新增了一些父类没有的方法,只有通过向下转型才能调用这些方法。
  • 在某些情况下,需要明确区分不同的子类对象,并对它们进行不同的操作,这就需要先向上转型统一处理,然后在必要时向下转型进行特殊处理。

它在代码中的表现形式是;            — — 子类引用指向父类实例

    Animal two =new Cat;
    
    Cat temp=(Cat)two;
    temp.eat();
    temp.run();

子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法,且必须满足转型条件才能进行强转

那么该怎样判断是否满足转型条件呢?

instanceof运算符的用法

这里我们用到了新的运算符instanceof,它主要判断左边的对象是否是它右边的类的实例,如果是,则返回true,否则返回false

 我们可以需要实现向下转型之前,先用instanceof运算符判断,因为它的返回值为布尔型(true和false),所以我们可以用if循环来判断

	if(two instanceof Cat) {
		Cat temp=(Cat)two;
		temp.eat();
		temp.run();
		System.out.println("two可以转换为Cat类型");
	}

运行结果

标签:JAVA,子类,代码,多态,Cat,Animal,父类,eat
From: https://blog.csdn.net/2301_79757798/article/details/141094862

相关文章

  • 深入理解 JavaScript 闭包
    前言在JavaScript中,闭包(Closure)是一个非常强大且常见的概念,它使得函数可以访问其外部作用域中的变量,即使在该函数外部作用域已经执行完毕的情况下。闭包广泛应用于回调函数、事件处理器、模块化编程等多个场景。本文将详细探讨闭包的定义、工作原理、常见应用场景以及潜在的陷......
  • 基于java的在线问卷调查系统的设计与实现
    @TOCspringboot145基于java的在线问卷调查系统的设计与实现第1章绪论**1.1课题背景二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。时代进步的标志,就是让人们过上更好的生活。在互联网诞生之前,地域位置往往是人们思想上......
  • Java jSerialComm库串口通信(USB RS-485/232) 查询/应答、主动上报模式
    JavajSerialComm库串口通信(USBRS-485/232)查询/应答、主动上报模式 查询/应答模式要在Java中通过USBRS-485接口发送和接收特定的数据帧,你需要利用适当的串行通信库。在Java中,一个常见的选择是使用RXTX或jSerialComm库。这些库允许Java应用程序与串行端口进行通信。......
  • 8.13 admin server 代码理解
    除了一些常规校验,还要考虑到更新的id是不是该店铺的 采用集合的方式快速计算budget表如何和biz业务表交互用于求最高值的加上判断数组是否越界的条件getSumInt64如果数组为空时发送什么 budget表是以Store为底层维度的,以biz连接,因此要体现出店铺的效果,可以少一......
  • 【开端】Java中Log级别和解析
    一、绪论Java系统中需要对日志进行输出,方便定位系统访问信息,系统报错信息,用于排查系统问题等。我们常常使用的日志有一下一些级别publicinterfaceLog{ booleanisDebugEnabled(); booleanisTraceEnabled(); voiderror(Strings,Throwablee); voiderror(......
  • Transformer--概念、作用、原理、优缺点以及简单的示例代码
    Transformer的概念Transformer是一种基于自注意力机制的神经网络模型,最早由Vaswani等人在2017年的论文《AttentionisAllYouNeed》中提出。它主要用于自然语言处理任务,如机器翻译、文本生成、文本分类等。与传统的循环神经网络(RNN)和长短时记忆网络(LSTM)不同,Transformer完全......
  • 商汤AI代码生成算法分析报告
    1.算法安全与监测信息内容安全商汤AI代码生成算法在处理用户输入时,必须确保数据内容的保密性和完整性。由于算法涉及敏感的编程信息,任何未授权的访问或数据泄露都可能导致严重的安全问题。因此,算法应采用加密传输和存储机制来保护数据。信息源安全算法需要验证用户输入的......
  • Java计算机毕业设计农村土地资源管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着农村经济的快速发展与城镇化进程的加速,农村土地资源的有效管理与合理利用成为亟待解决的问题。传统的手工记录与管理方式已难以满足当前农村土地......
  • Java计算机毕业设计教师档案管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着教育事业的蓬勃发展,教师作为教育教学的核心力量,其管理效率与质量直接关系到学校的整体运行与教学质量。传统的教师档案管理方式往往依赖于纸质文......
  • Java计算机毕业设计家装公司项目管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速与居民生活品质的提升,家装行业迎来了前所未有的发展机遇与挑战。传统家装公司依赖人工管理项目的方式已难以满足日益增长的客户......