Java语法之多态

news2024/10/6 4:00:57

上次给大家分享了Java的继承,今天小编给大家分享面向对象三大特性的第三大特性,也就是多态,fighting~~

目录

🎈一. 多态

🎈1.1多态的概念

🎈1.2多态的实现条件

🎈1.3向上转型和向下转型

🎈1.4多态的特性


🎉一.多态

1.1多态的概念

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作,举个例子,生活中的榨汁机,我们都是把水果放到榨汁机中去榨汁,但是你放进去什么水果,它就榨出来相对于的果汁,榨汁是一种行为,榨出来不同的的果汁就是不同的表现形式,希望这个例子可以帮助大家理解!


1.2多态的实现条件

👜在J ava 中要实现多态,必须要满足如下几个条件,缺一不可:
  • 1. 必须在继承体系下
  • 2. 子类必须要对父类中方法进行重写
  • 3. 通过父类的引用调用重写的方法

1.3向上转型和向下转型

1)向上转型

 向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
 语法格式:父类类型 对象名 = new 子类类型 ()

 我们来举个例子:

class Animal {
    public String name;
    public int age;

    public void sleep() {
        System.out.println(name + "正在睡觉!");
    }
}

class Dog extends Animal {
    public void wangwang() {
        System.out.println(name + "汪汪叫!");
    }
}

class Cat extends Animal {
    public void miaomiao() {
        System.out.println(name + "喵喵叫!");
    }
}

public class Test_1 {
    public static void main(String[] args) {
        Animal animal1 = new Dog();//向上转型
        animal1.name = "汪汪";
        animal1.age = 3;
        animal1.sleep();
        Animal animal2 = new Cat();//向上转型
        animal2.name="喵喵";
        animal2.age=5;
        animal2.sleep();
    }
}

代码里我们可以看到,通过animal1和animal2的引用发生向上转型,同时去给父类中成员赋值和调用方法,这里代码能正常跑起来,但是当我们去调用子类中特有的方法,程序就会报错,由此我们可以得出一个结论:当发生向上转型之后,此时通过父类的引用只能访问父类自己的成员,不能访问到子类特有的成员!!

 向上转型也是发生多态的前提!


补充:

向上转型的另外2中写法

1)方法传参

public class Test_1 {
    public static void fun(Animal animal){
        
    }
    public static void main(String[] args) {
        Dog dog=new Dog();
        fun(dog);  //这里也发生了向上转型,通过方法的传参
    }
}

2)方法的返回值

public static Animal fun1(){
        return new Dog();
    }//通过方法的返回值发生向上转型

接下来我们要介绍重写:

👜发生重写,必须满足三个条件:

  • 方法名称相同
  • 参数列表相同
  • 返回值相同

例如:

class Animal {
    public String name;
    public int age;

    public void sleep() {
        System.out.println(name + "正在睡觉!");
    }
}

class Dog extends Animal {
    public void wangwang() {
        System.out.println(name + "汪汪叫!");
    }
    public void sleep(){
        System.out.println(name+"重写了父类的sleep!");//发生了重写
    }
}

class Cat extends Animal {
    public void miaomiao() {
        System.out.println(name + "喵喵叫!");
    }
}

public class Test_1 {
    public static void main(String[] args) {
        Animal animal1 = new Dog();
        animal1.name = "汪汪";
        animal1.age = 3;
        animal1.sleep();
    }

通过运行结果我们可以看到,这里执行的是子类中的方法,这里其实发生了一个动态绑定,它的意思就是Java在编译的时候识别的是父类中的方法,但是在运行的时候绑定到了子类的方法,所以打印出来的结果也就是子类中的结果!

👜发生动态绑定的三个前提:

  • 向上转型
  • 重写
  • 父类和子类有相同的重写方法名

关于动态绑定,大家可以参考这位大佬的blog: 动态绑定和静态绑定!


 1.4多态的特性

  • 1. 消除类型之间的耦合关系
  • 2. 可替换性
  • 3. 可扩充性
  • 4. 接口性
  • 5. 灵活性
  • 6. 简化性

🎉总结

我们来看一下发生多态的完整代码

class Animal {
    public String name;
    public int age;

    public void sleep() {
        System.out.println(name + "正在睡觉!");
    }
}

class Dog extends Animal {
    public void wangwang() {
        System.out.println(name + "汪汪叫!");
    }

    public void sleep() {
        System.out.println(name + "正在玩耍");
    }
}

class Cat extends Animal {
    public void miaomiao() {
        System.out.println(name + "喵喵叫!");
    }

    @Override
    public void sleep() {
        System.out.println(name + "正在和别的猫玩耍");
    }
}

public class Test_1 {
    public static void function(Animal animal) { //发生了多态
        animal.sleep();
    }

    public static void main(String[] args) {
        Animal animal1 = new Dog();
        animal1.name = "汪汪";
        function(animal1);
        Animal animal2 = new Cat();
        animal2.name = "喵喵";
        function(animal2);

    }
}

上述代码中可以领悟到多态的思想,在function方法中的sleep行为,我们并不知道这一行为是由哪个对象去执行的,但是我们可以确实当你主方法中给function传参,传的是哪个对象,就执行哪个对象的方法所表现出来的行为,这就相当于一个接口,每个人都可以去使用它,但是每个人所想要的东西都不一样,正如前面给大家举的例子,榨汁机就相当于一个接口,你放什么水果进去,所榨出来的东西是不一样的,也就是所表现出来的行为不一样,这就是多态,多态的美妙之处!!!


多态是Java中一个重要的思想,如对上文有意见或者有错误,还请大佬们斧正,觉得有帮助的童鞋们,创作不易,蟹蟹三连!

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

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

相关文章

HDFS 的 shell操作

文章目录前言一、基本语法二、创建目录三、上传moveFromLocal-copyFromLocal-put-appendToFile四、下载-copyToLocal-get五、HDFS直接操作-ls-cat-chgrp、-chmod、-chown-mkdir-cp-mv-tail-rmrm -r-du-setrep前言 HDFS的shell操作很多跟linux的shell语法是比较相近&#xff0c…

Python学习基础笔记八——字典

字典: 1)字典中的元素是通过键来存储的,而不是通过偏移来存取的。字典是唯一内置的映射类型(键映射到值的对象) 2)是无序集合; 3)字典是作为散列表(支持快速检索的数据…

html网页设计期末大作业_网页设计平时作业(诗词网页 4页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | 等网站的设计与制作 | HTML期末大学生网页设计作业,…

39-Docker-部署Jenkins

部署Jenkins前言部署Jenkins1. 下载镜像2. 创建挂载目录3. 创建并启动Jenkins容器使用Jenkins1. 访问Jenkins2. 输入密码3. 配置Jenkins前言 本篇来学习使用Jenkins镜像部署Jenkins 部署Jenkins 1. 下载镜像 docker pull jenkins/jenkins2. 创建挂载目录 # 创建挂载目录 m…

Oracle PrimaveraUnifier成本管理器(Cost Manager)简要介绍

目录 一:标准成本管理器(Standad Cost Manager) 二:通用成本管理器(General Cost Manager) 成本管理器(Cost Manager)是Unifier管理和聚焦汇总成本的主要组成部分,财务最关系的Cost Sheet 成本表将通过 成本管理器制定模板 在Oracle Pirma…

第三章:高精度算法(加、减、乘、除)

高精度算法高精度的整体思路:一、加法1、思路:2、模板:(1)C版:(2)C语言版:二、减法1、思路:2、模板:CC三、乘法1、思路:2、模板&#…

CMake中return的使用

CMake中的return命令用于从文件、目录或函数返回&#xff0c;其格式如下&#xff1a; return([PROPAGATE <var-name>...]) 当在包含文件中(in an included file)遇到此命令时(通过include或find_package命令)&#xff0c;它会导致当前文件的处理停止并将控制权返回给包含…

CTFHub | Cookie注入

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

Linux C/C++ 学习笔记(五):Mysql C/C++编程 创建 插入 读取 删除 存储过程

本文参考Linux C/C 开发&#xff08;学习笔记七&#xff09;&#xff1a;Mysql数据库C/C编程实现 插入/读取/删除_菊头蝙蝠的博客-CSDN博客 一、数据库建模与建库建表 在设计数据库时&#xff0c;对现实世界进行分析、抽象、并从中找出内在联系&#xff0c;进而确定数据库的结…

计算机视觉之迁移学习中的微调(fine tuning)

现在的数据集越来越大&#xff0c;都是大模型的训练&#xff0c;参数都早已超过亿级&#xff0c;面对如此大的训练集&#xff0c;绝大部分用户的硬件配置达不到&#xff0c;那有没有一种方法让这些训练好的大型数据集的参数&#xff0c;迁移到自己的一个目标训练数据集当中呢&a…

javaweb Ajax AXios异步框架 JSON 案例

AJAX概念&#xff1a;AJAX(Asynchronous JavaScript And XML)&#xff1a;异步的 JavaScript 和 XML AJAX作用&#xff1a; 与服务器进行数据交换&#xff1a;通过AJAX可以给服务器发送请求&#xff0c;并获取服务器响应的数据 使用了AJAX和服务器进行通信&#xff0c;就可以…

ArcGIS_将多个点数据整合成一个点数据

问题描述:如何将多个点合并成一个点,并保留原始点数据的字段信息 方法一:整合 打开arcgis整合工具 :“数据管理工具——要素类——整合” 容差半径可以通过arcgis测量工具获取,根据自己的目标任务,选择合适的容差半径 该方法优点在于整合后的点可以正好位于原始点数据…

牛客网之SQL非技术快速入门(7)-字符串截取、切割、删除、替换

知识点&#xff1a; &#xff08;1&#xff09;substring_indexsubstring_index(str,delim,count) str:要处理的字符串 delim:分隔符 count:计数 &#xff08;2&#xff09;切割、截取、删除、替换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 select -- 替换法 replace(string, 被…

俺把所有粉丝显示在地图上啦~【详细教程+完整源码】

文章目录&#x1f332;小逼叨&#x1f332;爬取所有粉丝的IP所属地&#x1f334;爬者基本素养&#xff1a;网页分析&#x1f334;源代码&#x1f332;数据清洗和保存&#x1f334;源代码&#x1f332;绘制地图&#x1f334;源代码&#x1f332;结束语&#x1f332;小逼叨 其实昨…

windows中使用curl

curl这个工具在linux和macOS都经常使用&#xff0c;感觉挺实用的。在windows中默认也带了一个但是用起来不太一样&#xff0c;于是就想自己手动安装一个原汁原味的curl。 下载安装 https://curl.se/windows/ 下载适合自己平台的版本&#xff0c;解压就可以直接运行了。 比如…

剑指 Offer II 026. 重排链表【链表】

难度等级&#xff1a;中等 上一篇算法&#xff1a; 剑指 Offer II 021. 删除链表的倒数第 n 个结点【链表】 力扣此题地址&#xff1a; 剑指 Offer II 026. 重排链表 - 力扣&#xff08;LeetCode&#xff09; 1.题目&#xff1a;重排链表 给定一个单链表 L 的头节点 head &…

Linux用户和权限学习笔记

认识root用户 什么是root用户 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09;而在前期&#xff0c;我们一直使用的账户是普通账户&#xff1a;itheim…

《Android Studio开发实战 从零基础到App上线(第3版)》出版后记

2018年11月&#xff0c;经过熬夜写作的《Android Studio开发实战 从零基础到App上线(第2版)》正式出版面世。承蒙众多读者的厚爱&#xff0c;第2版的图书在此后的三年多时间&#xff0c;一直保持在移动开发图书的销量排行榜前列&#xff0c;迄今为止京东对该书的评价已达8000多…

设计模式基础-概括

目录 一、设计原则 二、设计模式分类 1、创建型模式&#xff1a;创建对象 2、结构型模式&#xff1a;更大的结构 3、行为型模式&#xff1a;交互以及职责分配 4、对象模式与类模式区别 三、各类型模式简介 1、创建型模式 2、结构型模式 3、行为型模式 一、设计原则 …

JAVA中Function的使用

JAVA中Function的使用一、方法介绍参数类型方法介绍源码二、demo参考&#xff1a; https://blog.csdn.net/boyan_HFUT/article/details/99618833 一、方法介绍 表示接受一个参数并产生结果的函数。 参数类型 T - 函数输入的类型R - 函数的结果类型 方法介绍 R apply(T t) …