初识JAVA-面向对象的三大特征之多态

news2025/1/15 5:29:09

1. 重温面向对象

面向对象是一种解决问题的思想,它把计算机程序看作是各种对象组合起来的。每个对象都有自己的数据(属性)和行为(方法),主要依靠对象之间的交互来解决和实现问题。Java是一门纯面向对象的语言(Object Oriented Program,简称OOP)。

2. 多态

2.1 多态的概念

多态,简单来说就是多种形态,复杂点说就是不同对象去完成某个行为时产生不同的状态。

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

2.2 多态实现条件

Java中实现多态,必须满足以下的条件,缺一不可:

1. 必须在继承的体系下才可以实现多态

2. 子类必须要对父类方法机械能重写

3. 通过父类的引用调用重写的方法

父类:

public class Pet{
    String name;
    String species;

    public Pet(String name, String species) {
        this.name = name;
        this.species = species;
    }
    public void eat(){
        System.out.println(name+"在进食");
    }
}

子类:

public class Cat extends Pet{
    public Cat(String name, String species) {
        super(name, species);
    }

    @Override
    public void eat() {
        System.out.println(name+"吃冻干");
    }
}
public class Dog extends Pet{
    public Dog(String name, String species) {
        super(name, species);
    }

    @Override
    public void eat() {
        System.out.println(name+"吃狗粮");
    }
}

进行测试:

public class TestPet {
    public static void eat(Pet pet){
        pet.eat();
    }
    public static void main(String[] args) {
        Cat cat=new Cat("咪咪","猫科动物");
        Dog dog=new Dog("旺旺","犬科动物");
        eat(cat);
        eat(dog);
    }
}

TestPet的代码时类调用者的编写

当类的调用者在编写eat这个方法时,参数类型为Pet(父类),此时在该类方法内部并不知道,也不关注当前的pet引用指向的那个子类的实例,pet这个引用调用的eat方法就可能有多种不同的表现(和pet引用的实例相关),这种行为就成为多态。

2.3 重写

重写(Override):也称为覆盖。重写是子类对父类非静态,非private修饰,非fianl修饰,非构造方法等的实现过程进行重新编写,返回值和形参都不能改变(外表不变,内心改变)。重写的好处在于子类可以根据需要,定义特定于自己的行为。

方法重写的规则:

1. 子类在重写父类方法时,必须与父类方法的方法名,参数列表要完全一致

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

3. 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为protected

4. 父类被static,private修饰的方法,构造函数都不能被重写

5. 重写的方法,可以使用@Override注解来显式指定

2.4 重写和重载的区别

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

2.5 向上转型和向下转型

向上转型:实际就是创建一个子类对象,将其当作父类对象来使用

语法格式:父类类型 对象名=new 子类对象( )

Pet pet=new Dog("汪汪","犬科动物")

Pet是父类类型,但是可以引用一个子类对象,因为是从小范围到大范围的转换。

 使用场景:

1. 直接赋值

2. 方法传参

3. 方法返回

public class TestPet {
    //2.方法传参:形参为父类类型,可以接收子类对象
    public static void eat(Pet pet){
        pet.eat();
    }
    //3.作为返回值:返回任意子类对象
    public static Pet buyPet(String species){
        if("犬科动物".equals(species)){
            return new Dog("汪汪","犬科动物");
        }else if("猫科动物".equals(species)){
            return new Cat("咪咪","猫科动物");
        }else {
            return null;
        }
    }
    public static void main(String[] args) {
        //1.直接赋值:子类对象赋值给父类对象
        Pet cat=new Cat("咪咪","猫科动物");
        Pet dog=new Dog("旺旺","犬科动物");

        eat(cat);
        eat(dog);

        Pet pet=buyPet("犬科动物");
        pet.eat();

    }
}

向上转型的优点:让代码实现更加灵活

向上转型的缺点:不能调用子类特有的方法

将一个子类对象经过向上转型后当成父类方法使用,再也无法调用子类特有的方法,但有时候可能需要子类特有的方法,此时我们引入了向下转型。

向下转型:将父类引用还原成子类对象。

向下转型存在不安全的特点,例如下述代码:

public class Pet{
    String name;
    String species;

    public Pet(String name, String species) {
        this.name = name;
        this.species = species;
    }
    public void eat(){
        System.out.println(name+"在进食");
    }

}
public class Dog extends Pet{
    public Dog(String name, String species) {
        super(name, species);
    }

    @Override
    public void eat() {
        System.out.println(name+"吃狗粮");
    }
    public void bark(){
        System.out.println("汪汪汪!");
    }
}
public class Cat extends Pet{
    public Cat(String name, String species) {
        super(name, species);
    }

    @Override
    public void eat() {
        System.out.println(name+"吃冻干");
    }
    public void mew(){
        System.out.println("喵喵喵!");
    }
}
public class TestPet {

    public static void eat(Pet pet){
        pet.eat();
    }

    public static void main(String[] args) {
        Cat cat=new Cat("咪咪","猫科动物");
        Dog dog=new Dog("旺旺","犬科动物");
        //向上转型
        Pet pet=cat;
        pet.eat();
        pet=dog;
        pet.eat();
        //此时pet指向的是dog,强制还原为cat,无法正常还原,抛出ClassCastException
        cat= (Cat) pet;
        cat.mew();

        dog=(Dog) pet;
        dog.bark();

    }
}

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

public class TestPet {

    public static void eat(Pet pet){
        pet.eat();
    }

    public static void main(String[] args) {
        Cat cat=new Cat("咪咪","猫科动物");
        Dog dog=new Dog("旺旺","犬科动物");
        //向上转型
        Pet pet=cat;
        pet.eat();
        pet=dog;
        pet.eat();
        
        if(pet instanceof Cat){
            cat= (Cat) pet;
            cat.mew();
        }

        if(pet instanceof Dog){
            dog=(Dog) pet;
            dog.bark();
        }
    }
}

2.6 多态的优缺点

多态的好处

1. 能够降低代码的圈复杂度,避免使用大量的if-else语句

圈复杂度是一种描述代码复杂程度的方式,一段代码平铺直叙,那么比较简单理解,如果有很多分支条件或者循环语句,就认为理解起来复杂。

2. 可拓展能力强

如果要新增一种行为,使用多态的方式代码改动的成本就比较低

多态的缺点:

1. 属性没有多态性

当父类和子类都有同名的属性时,通过弗雷德引用,只能引用父类自己的成员属性

2.构造方法没有多态性

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

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

相关文章

Pytorch基础教程:从零实现手写数字分类

1.Pytorch简介 ‌PyTorch是一个开源的深度学习框架,由Facebook的人工智能研究院(FAIR)开发,并于2017年1月正式推出。‌ PyTorch以其灵活性和易用性著称,特别适合于深度学习模型的构建和训练。它基于Torch张量库开发&a…

高性能现代PHP全栈框架 Spiral

概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架,旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器,Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…

运维高级课作业三

源码编译安装httpd 2.4 首先下载好httpd-2.4.62.tar.bz2的安装包 将这个文件传入Linux中 将他解归档解入/usr/src/ rpm -e httpd --nodeps # 如果系统自带httpd这个软件要删除掉,两个软件不能同时运行 yum -y install apr apr-devel cyrus-sasl-devel expat-dev…

.Net8 Avalonia跨平台UI框架——<vlc:VideoView>控件播放海康监控、摄像机视频(Windows / Linux)

一、UI效果 二、新建用户控件:VideoViewControl.axaml 需引用:VideoLAN.LibVLC.Windows包 Linux平台需安装:VLC 和 LibVLC (sudo apt-get update、sudo apt-get install vlc libvlccore-dev libvlc-dev) .axaml 代码 注…

【HM-React】08. Layout模块

基本结构和样式reset 结构创建 实现步骤 打开 antd/Layout 布局组件文档,找到示例:顶部-侧边布局-通栏拷贝示例代码到我们的 Layout 页面中分析并调整页面布局 代码实现 pages/Layout/index.js import { Layout, Menu, Popconfirm } from antd impor…

Canvas简历编辑器-选中绘制与拖拽多选交互方案

Canvas简历编辑器-选中绘制与拖拽多选交互方案 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM,并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上,关注于实现选中绘制与拖拽多选交…

C# OpenCV机器视觉:转速测量

在一个看似平常却又暗藏神秘能量的日子里,阿杰正在他那充满科技感的实验室里,对着一堆奇奇怪怪的仪器发呆。突然,手机铃声如一道凌厉的剑气划破寂静,原来是工厂的赵厂长打来的紧急电话:“阿杰啊,咱们工厂新…

vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动

需求:有个长方形的容器,但是需要正方形的网格线,网格线是等比缩放的并且可以无线拖动的,并且添加自适应缩放和动态切换,工具是plotly.js,已完成功能如下 1.正方形网格 2.散点分组 3.自定义悬浮框的数据 4.根据窗口大小…

0基础跟德姆(dom)一起学AI 自然语言处理13-注意力机制介绍2

1 注意力机制规则 它需要三个指定的输入Q(query), K(key), V(value), 然后通过计算公式得到注意力的结果, 这个结果代表query在key和value作用下的注意力表示. 当输入的QKV时, 称作自注意力计算规则;当Q、K、V不相等时称为一般注意力计算规则 例子:seq2…

慧集通(DataLinkX)iPaaS集成平台-系统管理之UI库管理、流程模板

UI库管理 UI库管理分为平台级和自建两种,其中平台级就是慧集通平台自己内置的一些ui库所有客户均可调用,自建则是平台支持使用者自己根据规则自己新增对应的UI库。具体界面如下: 自建UI库新增界面: 注:平台级UI库不支…

通过一个算法的设计来了解栈的一些应用

目录 1.前言 2.步骤 3.代码实现 4.测试 5.运行结果 6.一些思考 7.一些应用示例 1.前言 掌握堆栈的基本原理 掌握堆栈的存储结构 掌握堆栈的进栈、出栈; 判断栈空的实现方法 掌握应用堆栈实现括号匹配的原理和实现方法; 熟悉python语言编程 熟练…

USB 驱动开发 --- Gadget 驱动框架梳理(一)

本文由 Linux 内核文档翻译与总结而来,个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中,角色定义: the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver),负责与 …

字符串算法篇——字里乾坤,算法织梦,解构字符串的艺术(下)

文章目录 前言第一章:最长公共前缀1.1 题目链接:https://leetcode.cn/problems/longest-common-prefix/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 第二章:最长回文子串2.1 题目链接&#xff1a…

计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)

局域网: LAN:在某一区域内由多台计算机互联成的计算机组,使用广播信道 特点: 覆盖范围有限:通常局限在几千米范围内,比如一栋办公楼、一个校园或一个工厂等相对较小的地理区域。 数据传输速率高:一般能达到 10Mbps…

istio-proxy oom问题排查步骤

1. 查看cluster数量 cluster数量太多会导致istio-proxy占用比较大的内存,此时需检查是否dr资源的host设置有配置为* 2. 查看链路数据采样率 若采样率设置过高,在压测时需要很大的内存来维护链路数据。可以调低采样率或增大istio-proxy内存。 检查iop中…

fast-crud select下拉框 实现多选功能及下拉框数据动态获取(通过接口获取)

教程 fast-crud select示例配置需求:需求比较复杂 1. 下拉框选项需要通过后端接口获取 2. 实现多选功能 由于这个前端框架使用逻辑比较复杂我也是第一次使用,所以只记录核心问题 环境:vue3,typescript,fast-crud ,elementPlus 效果 代码 // crud.tsx文件(/.ts也行 js应…

Apache JMeter 压力测试使用说明

文章目录 一、 安装步骤步骤一 下载相关的包步骤二 安装 Jmeter步骤三 设置 Jmeter 工具语言类型为中文 二、使用工具2.1 创建测试任务步骤一 创建线程组步骤二 创建 HTTP 请求 2.2 配置 HTTP 默认参数添加 HTTP消息头管理器HTTP请求默认值 2.3 添加 查看结果监听器2.4 查看结果…

计算机网络 (40)域名系统DNS

前言 计算机网络域名系统DNS(Domain Name System)是互联网的基础技术之一,它负责将人类可读的域名转换为计算机用来通信的数字IP地址。 一、基本概念 DNS的主要目的是将域名解析或翻译为IP地址,使得用户可以通过简单易记的域名来访…

本地服务器Docker搭建个人云音乐平台Splayer并实现远程访问告别烦人广告

前言 大家好!今天我要给大家分享的是如何在Ubuntu上用Docker快速搭建高颜值无广告的某抑云音乐播放器Splayer的详细流程,并且结合cpolar内网穿透工具实现远程访问。如果你是音乐爱好者,经常需要在外办公或旅行,这个教程绝对能让你…

黑马linux入门笔记(01)初始Linux Linux基础命令 用户和权限 实用操作

B站 黑马程序员 的视频 BV1n84y1i7td 黑马程序员新版Linux零基础快速入门到精通,全涵盖linux系统知识、常用软件环境部署、Shell脚本、云平台实践、大数据集群项目实战等 增强自控力 冥想慢呼吸绿色锻炼充分休息减少决策次数优先做重要的事情(早晨)融入强自控群控…