java中多态的用法

news2024/11/25 18:50:49

思维导图:

 

1. 多态的概念

多态通俗的讲就是多种形态同一个动作,作用在不同对象上,所产生不同的形态。

例如下图:

2. 多态的实现条件

Java中,多态的实现必须满足以下几个条件:
1. 必须在继承体系下
2. 子类必须重写父类中的方法
3. 通过父类的引用调用重写方法


多态体现:在代码运行时,当传递不同对象时,会调用对应类中的方法
看以下代码:

 
public abstract class Animal {
    String name;
    int age;
    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void eat(){
        System.out.println(name+"吃粮食");
    }
}
 
 
public class Dog extends Animal {
    public Dog(String name, int age) {
        super(name, age);
    }
 
    @Override
    public void eat() {
        System.out.println(name+"爱吃骨头");
    }
}
///
 
public class Cat extends Animal {
    public Cat(String name, int age) {
        super(name, age);
    }
 
    @Override
    public void eat() {
        System.out.println(name+"爱吃鱼");
    }
}
 
/
 
public class TestAnimal {
    //编译器在编译代码时,并不知道调用Dog还是Cat中的eat方法
    //等程序运行起来后,形参a引用的具体对象确定后,才知道调用哪个方法
    //注意:此处的形参类型必须是父类类型才可以
    public static void eat(Animal a){
        a.eat();
    }
 
    public static void main(String[] args) {
        Dog dog = new Dog("旺财",2);
        Cat cat = new Cat("糯米",1);
        eat(dog);
        eat(cat);
    }
}

3. 重写


重写(override)也称为覆盖,重写是子类对父类非静态,非private修饰,非final修饰,非构造方法等的实现过程进行重新编写返回值和形参都不能改变,核心重写。

方法重写规则:

1:子类重写父类方法时,一般必须与父类方法原型保持一致:修饰符 返回值类型 方法名(参数列表)要完全一致

2:JDK7以后,被重写的方法返回值类型可以不同,但是必须具有父子关系

3: 访问权限不能比父类父类中被重写的方法的访问权限低。

4:父类中被static private 修饰的方法,构造方法都不能被重写

5:重写的方法可以用@Override注解来显示指定

 重写和重载的区别:

 即:方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现

静态绑定:也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型确定具体调用哪个方法。典型代表:重载

动态绑定:也成为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时才能够确定调用哪个类的方法

 4:向上转型和向下转型

 向上转型:一个父类对象的引用指向一个子类对象的实例。
 语法格式:父类类型  对象名  =   new  子类类型();

 如:Animal animal = new Cat("小七",1);

animal是父类类型,但可以引用一个子类对象,即:可以将一个子类对象当成父类对象来引用。因此:向上转型是安全的,因为是从小范围向大范围的转换。

使用场景:1:直接赋值     2:方法传参     3:方法返回

请看如下代码:

public class TestAnimal {
    //方法传参:形参为父类类型引用,可以接受任意子类对象
    public static void eat(Animal a){
        a.eat();
    }
    //作为返回值:返回任意子类对象
    public static Animal buyAnimal(String var){
        if("狗" == var){
            return new Dog("小七",2);
        }else if("猫" == var){
            return new Cat("汤圆",1);
        }else{
            return null;
        }
    }
 
    public static void main(String[] args) {
        Animal dog = new Dog("旺财",2);   //直接赋值:子类对象赋给父类对象
        Aniaml cat = new Cat("糯米",1);
        eat(dog);
        eat(cat);
        Animal animal = buyAnimal("狗");
        animal.eat();
        animal = buyAnimal("猫");
        animal.eat();
 
    }
}

向上转型的优点:让代码实现更简单灵活
向上转型的缺陷:不能调用到子类特有的方法 

 向下转型
将一个子类对象向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转型。

public class TestAnimal {
    public static void eat(Animal a){
        a.eat();
    }
 
    public static void main(String[] args) {
        Dog dog = new Dog("旺财",2);
        Cat cat = new Cat("糯米",1);
        Animal animal = dog;
        animal.eat();
       // animal.bark();    编译器报错,Animal类中没有bark方法
        dog = (Dog)animal;
        dog.bark();
        animal = cat;
        animal.eat();
       // animal.mew();    编译器报错,Animal类中没有mew方法
        cat = (Cat)animal;
        cat.mew();
    }
}

向下转型不安全,万一转型失败,运行就会抛异常。Java中为了提高向下转型的安全性,引入了instanceof,如果该表达式为true,则可以安全转换 

public class TestAnimal {
    public static void eat(Animal a){
        a.eat();
    }
 
    public static void main(String[] args) {
        Dog dog = new Dog("旺财",2);
        Cat cat = new Cat("糯米",1);
        Animal animal = dog;
        animal.eat();
        animal = cat;
        animal.eat();
        if(animal instanceof Dog){
            dog = (Dog)animal;
            dog.bark();
        }
        if(animal instanceof Cat){
            cat = (Cat)animal;
            cat.mew();
        }
    }
}

 多态的优点
 1:能够降低代码的“圈复杂度”,避免使用大量的if-else
假如我们现在要打印多个形状而不是一个形状

public static void drawShapes(){
        Ret ret = new Rect();
        Cycle cycle = new Cycle();
        Flower flower = new Flower();
        String[] shapes = {"cycle","ret","flower","cycle","flower"};
        for(String shape : shapes){
            if(shape.equals("cycle")){
                cycle.draw();
            }
            if(shape.equals("ret")){
                ret.draw();
            }
            if(shape.equals("flower")){
                flower.draw();
            }
        }
    }

 如果使用多态,代码更简单:请看如下代码:

 public static void drawShapes(){
        Shape[] shapes = {new Cycle(),new Rect(),new Cycle(),new Flower()};
        for(Shape shape : shapes){
            shape.draw;
        }
    }

2. 可扩展能力强
增加一种新的形状,使用多态的方式代码改动成本低

class Tringle extends Shape{
    @Override
    public void draw(){
        System.out.println("三角形");
    }
}

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

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

相关文章

动画革命:Lottie如何改变我们对移动应用交互的认知

在数字世界的浩瀚星空中,每一个像素都跃动着无限创意与想象的火花。当静态的界面遇上动态的魔法,一场视觉盛宴便悄然开启。今天,让我们一同揭开一位幕后英雄的神秘面纱——Lottie,这个在UI/UX设计界掀起波澜的动画利器&#xff0c…

[trick]使用生成器打破嵌套循环

原文 break用于结束循环。但是,如果有嵌套循环,如何跳出外层循环? def this_is_the_one(x):return x 3my_list [[1, 2], [3, 4], [5, 6]] for sublist in my_list:for element in sublist:print(f"Checking {element}")if this_…

农场驿站平台小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,农场资讯管理,卖家管理,用户分享管理,分享类型管理,商品信息管理,商品分类管理,系统管理,订单管…

天舟飞船可视化:直观体验太空任务全过程

利用图扑先进的 3D 可视化技术,实时展示天舟飞船的发射、对接和任务执行,为观众提供身临其境的太空探索体验。

奥比岛手游攻略:新手攻略大全!云手机辅助!

《奥比岛:梦想国度》是一款画风可爱的Q版休闲益智手游。在这个充满童话色彩的世界里,玩家们可以度过快乐的每一天,结交许多朋友,完成各种任务,体验丰富多彩的游戏玩法。下面将为大家带来详细的攻略大全。 游戏前瞻&…

Java 面试 | Redis

目录 1. 在项目中缓存是如何使用的?2. 为啥在项目中要用缓存?3. 缓存如果使用不当会造成什么后果?4. redis 和 memcached 有什么区别?5. redis 的线程模型是什么?6. 为什么单线程的 redis 比多线程的 memcached 效率要…

Python酷库之旅-第三方库Pandas(035)

目录 一、用法精讲 106、pandas.Series.iloc方法 106-1、语法 106-2、参数 106-3、功能 106-4、返回值 106-5、说明 106-6、用法 106-6-1、数据准备 106-6-2、代码示例 106-6-3、结果输出 107、pandas.Series.__iter__魔法方法 107-1、语法 107-2、参数 107-3、…

Science Robotics 一种使用导电嵌段共聚物弹性体和心理物理阈值来实现准确触觉效果的方法

速读:电触觉刺激作为感官替代的形式存在许多问题,如反应不一致、疼痛和脱敏等问题。加州大学Darren J. Lipomi教授团队研究了一种利用导电嵌段共聚物弹性体和心理物理阈值来实现准确触觉的方法。通过优化材料、设备布局和校准技术,他们在10名…

web服务器——虚拟主机配置实战

搭建静态网站 —— 基于 http 协议的静态网站 实验 1 :搭建一个 web 服务器,访问该服务器时显示 “hello world” 欢迎界面 。 实验 2 :建立两个基于 ip 地址访问的网站,要求如下 该网站 ip 地址的主机位为 100 ,设置…

jupyter_contrib_nbextensions安装失败问题

目录 1.文件路径长度问题 2.jupyter不出现Nbextensions选项 1.文件路径长度问题 问题: could not create build\bdist.win-amd64\wheel\.\jupyter_contrib_nbextensions\nbextensions\contrib_nbextensions_help_item\contrib_nbextensions_help_item.yaml: No su…

【强化学习的数学原理】课程笔记--4(随机近似与随机梯度下降,时序差分方法)

目录 随机近似与随机梯度下降Mean estimationRobbins-Monro 算法用 Robbins-Monro 算法解释 Mean estimation用 Robbins-Monro 算法解释 Batch Gradient descent用 SGD 解释 Mean estimation SGD 的一个有趣的性质 时序差分方法Sarsa 算法一个例子 Expected Sarsa 算法n-step S…

LLM基础模型系列:Prefix-Tuning

------->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<------ Prefix Tuning和Prompt Tuning最大的区别就是向每层的Transformer Block添加可训练的张量&#xff0c;而上一期的Prompt Tuning只是在输入的时候添加。 此外&#xff0c;通过全连接层&a…

【BUG】已解决:ModuleNotFoundError: No module named ‘sklearn‘

已解决&#xff1a;ModuleNotFoundError: No module named ‘sklearn‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named ‘sklearn‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是…

模型剪枝入门

一、定义 1.定义 2. 案例1 3. 全局剪枝案例 4. 全局剪枝案例 5. 自定义剪枝 6. 特定网络剪枝 7. 多参数模块剪枝 8. torch.nn.utils.prune 解读 二、实现 定义 接口&#xff1a; import torch.nn.utils.prune as prune案例1 import torch.nn as nn import torch.nn.utils.…

深入理解Linux网络(二):UDP接收内核探究

深入理解Linux网络&#xff08;二&#xff09;&#xff1a;UDP接收内核探究 一、UDP 协议处理二、recvfrom 系统调⽤实现 一、UDP 协议处理 udp 协议的处理函数是 udp_rcv。 //file: net/ipv4/udp.c int udp_rcv(struct sk_buff *skb) {return __udp4_lib_rcv(skb, &udp_…

IntelliJ IDEA 直接在软件中更新为最新版

当我们的 IDEA 工具许久没有更新&#xff0c;已经拖了好几个版本&#xff0c;想跨大版本更新&#xff0c;比如从2020.2.1 -> 2023.x.x 此时&#xff0c;我们菜单栏点击 Help -> Check for Updates… &#xff0c;右下角会有提示更新&#xff0c;如下图&#xff1a; 点…

【深大计算机系统(2)】实验一 实验环境配置与使用 附常用指令

目录 一、 实验目标&#xff1a; 二、实验环境与工件&#xff1a; 三、实验内容与步骤 1. 学习并熟悉Linux基本操作&#xff0c;按照要求创建用户。&#xff08;30分&#xff09; 2.新建用户主目录下创建子目录&#xff1a;gdbdebug&#xff0c;并进入gdbdebug子目录。将过程和…

亲测--linux下安装ffmpeg最新版本---详细教程

下载地址 Download FFmpeg 下载最新的https://ffmpeg.org/releases/ffmpeg-7.0.1.tar.xz 上传到服务器 解压 tar xvf ffmpeg-7.0.1.tar.xz 编译 cd ffmpeg-7.0.1 ./configure --prefix=/usr/local/ffmpeg make && make install 报错: 解决:在后面加 跳过检测…

粉尘传感器助力面粉厂安全生产

在面粉加工行业中&#xff0c;粉尘问题一直是一个不容忽视的难题。从原料的破碎、研磨到成品的包装&#xff0c;整个生产流程中都会伴随着大量的粉尘产生。这些粉尘不仅影响生产环境&#xff0c;更对工作人员的健康、设备的安全运行以及环境保护构成严重威胁。因此&#xff0c;…

【Unity实战100例】Unity声音可视化多种显示效果

目录 一、技术背景 二、界面搭建 三、 实现 UIAudioVisualizer 基类 四、实现 AudioSampler 类 五、实现 IAudioSample 接口 六、实现MusicAudioVisualizer 七、实现 MicrophoneAudioManager 类 八、实现 MicrophoneAudioVisualizer 类 九、源码下载 Unity声音可视化四…