Java:多态

文章目录

  • 一、概念
  • 二、使用前提
  • 三、实例
  • 四、优缺点
    • 4.1 优点
    • 4.2 缺点
  • 五、动态绑定和静态绑定
    • 5.1 动态绑定
    • 5.2 静态绑定

一、概念

多态是指类的多种形态,同一个接口,使用不同的实例而执行不同操作。


二、使用前提

  • 有继承/实现关系
  • 有父类引用指向子类对象
  • 有方法的重写

三、实例

这是一个实现多态的例子,具体看注释信息:

public class Test {
    public static void main(String[] args) {
        // 创建对象 (多态方法)
        Animal animal = new Dog();
        // 访问成员变量:编译看左,运行也看左
        // 编译看左:当程序编译时,系统会去父类查看是否存在当前变量,如果存在,编译成功,不存在,则编译报错
        // 运行看左:当程序运行时,系统实际会去调用父类的成员变量
        System.out.println("====== 成员变量 ======");
        System.out.println(animal.name);
        // 访问成员方法:编译看左,运行看右
        // 编译看左:当程序编译时,系统会去父类查看是否存在当前方法,如果存在,编译成功,不存在,则编译报错
        // 运行看右:当程序运行时,系统实际会去调用子类的成员方法
        System.out.println("====== 成员方法 ======");
        animal.show();
}

// 动物类
class Animal {
    String name = "动物";

    public void show() {
        System.out.println("Animal === show()");
    }
}

// 狗类
class Dog extends Animal {
    String name = "狗";

    @Override
    public void show() {
        System.out.println("Dog === show()");
    }
}

// 猫类
class Cat extends Animal {
    String name = "猫";

    @Override
    public void show() {
        System.out.println("Dog === show()");
    }
}

运行结果:

====== 成员变量 ======
动物
====== 成员方法 ======
Dog === show()

四、优缺点

4.1 优点

  • 在多态的形式下,右边的子类对象可以实现解耦合,便于扩展和维护;
  • 当定义方法时,你可以使用父类来作为方法的参数,这样就可以接受所有的子类对象,体现了多态的灵活性。

4.2 缺点

  • 不能使用子类的特有方法,因为当使用多态的形式去调用方法,它会去看父类有没有这个方法,如果没有则报错。

注:可以通过强制类型转换解决,具体看下列代码

细节:强制转换时,转换的类型和创建时对象的类型必须保持一致,不然会报错,可以使用

instanceof关键字,判断对象的类型。

强制类型装换

public class Test {
    public static void main(String[] args) {
        // 创建对象 (多态方法)
        Animal animal = new Dog();
        // 调用狗类特有方法 (强制类型转换)
        Dog dog = (Dog) animal;
        dog.eat();
    }
}

// 动物类
class Animal {
    String name = "动物";

    public void show() {
        System.out.println("Animal === show()");
    }
}

// 狗类
class Dog extends Animal {
    String name = "狗";

    @Override
    public void show() {
        System.out.println("Dog === show()");
    }

    // 特有方法
    public void eat() {
        System.out.println(name + "吃食物");
    }
}

instance 关键字

public class Test {
    public static void main(String[] args) {
        // 创建对象 (多态方法)
        Animal animal = new Dog();
        // 调用狗类特有方法 (instance 关键字)
        if (animal instanceof Dog dog) {
            dog.eat();
        }
    }
}

// 动物类
class Animal {
    String name = "动物";

    public void show() {
        System.out.println("Animal === show()");
    }
}

// 狗类
class Dog extends Animal {
    String name = "狗";

    @Override
    public void show() {
        System.out.println("Dog === show()");
    }

    // 特有方法
    public void eat() {
        System.out.println(name + "吃食物");
    }
}

// 猫类
class Cat extends Animal {
    String name = "猫";

    @Override
    public void show() {
        System.out.println("Dog === show()");
    }
}

运行结果:

狗吃食物

五、动态绑定和静态绑定

5.1 动态绑定

动态绑定是多态的基础,也叫运行时绑定,动态绑定的关键在于,当我们通过一个引用调用一个方法时,JVM会检查对象的实际类型,然后决定调用哪个方法。如果在父类和子类中都定义了相同的方法(即方法重写),那么将调用的是子类中的方法。

5.2 静态绑定

静态绑定,也称为早期绑定或编译时绑定,是在编译阶段就确定方法调用的过程。与动态绑定不同,静态绑定在编译时就能确定将要调用哪个方法,不需要等到运行时。

在Java中,以下几种情况会使用静态绑定:

  • 成员变量访问:当访问类的成员变量时,无论引用是什么类型,都会直接访问对象的实际类型中的变量,但是这个访问在编译期就已经确定了,所以属于静态绑定。
  • static静态方法调用:静态方法属于类而不属于对象,所以在调用静态方法时,不会发生动态绑定,而是直接调用该类的静态方法,这属于静态绑定。
  • final方法调用:如果一个方法被声明为final,那么这个方法不能被子类重写,所以在调用这个方法时,会直接调用父类的final方法,这属于静态绑定。
  • 构造器调用:构造器的调用也是在编译时期就确定的,属于静态绑定。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

读书笔记-《魔鬼经济学》

这是一本非常有意思的经济学启蒙书,作者探讨了许多问题,并通过数据找到答案。 我们先来看看作者眼中的“魔鬼经济学”是什么,再选一个贴近我们生活的例子进行阐述。 01 魔鬼经济学 中心思想:假如道德代表人类对世界运转方式的期…

Vue 3集成krpano 全景图展示

Vue 3集成krpano 全景图展示 星光云全景系统源码 VR全景体验地址 星光云全景VR系统 将全景krpano静态资源文件vtour放入vue项目中 导入vue之前需要自己制作一个全景图 需要借助官方工具进行制作 工具下载地址:krpano工具下载地址 注意事项:vuecli…

LRU缓存算法设计

LRU 缓存算法的核⼼数据结构就是哈希链表,双向链表和哈希表的结合体。这个数据结构⻓这样: 创建的需要有两个方法,一个是get方法,一个是put方法。 一些问题:为什么需要使用双向链表呢?因为删除链表的本身&…

2-26 基于matlab开发的制冷循环模型

基于matlab开发的制冷循环模型。Simscape两相流域中的制冷循环模型,在simulink中完成多循环温度控制。程序已调通,可直接运行。 2-26 制冷循环模型 Simscape两相流域 - 小红书 (xiaohongshu.com)

Web3D引擎,three.js堪称扛把子,Babylon.js差点意思。

涉及到Web3D开发,Three.js和Babylon.js是两个备受推崇的引擎。它们都是基于WebGL的开源3D引擎,用于创建交互式的3D图形应用程序,但要细论起来,three.js普及度远超Babylon .js. 一、二者的介绍 Three.js: Three.js 是一…

Android仿今日头条新闻(一)

新建一个侧边栏的文件,创建成功后直接运行。可以看到带滑动的侧边栏功能如图所示: 主体UI: 新闻UI的实现: 侧边栏: 更换一下颜色: 学习参考-浩宇开发

Objects365数据集介绍

Objects365数据集介绍 什么是Objects365数据集?数据集的规模与内容数据集的特点数据集下载 什么是Objects365数据集? Objects365是一个大规模、高质量的物体检测数据集。该数据集旨在推动物体检测技术的发展,特别是在真实世界场景下的应用。O…

STM32-01 推挽输出-点亮LED

本文以STM32中点亮LED为例,解读推挽输出的原理 推挽输出介绍 所谓的推挽输出,就是通过控制输出控制模块,打开或者关闭P-MOS或者N-MOS。 ─ 推挽模式下:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-M…

尚品汇-(十三)

&#xff08;1&#xff09;查询sku列表 在ManageService 中添加 /*** SKU分页列表* param pageParam* return*/ IPage<SkuInfo> getPage(Page<SkuInfo> pageParam);接口实现类 Override public IPage<SkuInfo> getPage(Page<SkuInfo> pageParam) {Qu…

【双一流高校主办,Springer-LNICST出版,EI稳定检索】2024年应用计算智能、信息学与大数据国际会议(ACIIBD 2024,7月26-28)

2024年应用计算智能、信息学与大数据国际学术会议&#xff08;ACIIBD 2024&#xff09;将于2024年7月26-28日在中国广州举办。会议将聚焦于计算智能及其应用、信息、大数据等相关的研究领域&#xff0c; 广泛邀请国内外知名专家学者&#xff0c;共同探讨相关学科领域的最新发展…

Ubuntu + SSH密钥连接服务器

1. 下载VS code cd到下载文件夹后&#xff0c;使用命令安装&#xff0c;把xxx复制为文件名 sudo dpkg -i xxx.deb2. 为VSCode换皮肤 3. 下载SSH插件和Docker插件 4. 配置SSH 把密钥key文件放在/home/your_user_name/.ssh/里面&#xff0c;然后在/home/your_user_name/.ssh/c…

第1集《修习止观坐禅法要》

《修习止观坐禅法要》诸位法师&#xff0c;诸位学员&#xff0c;阿弥院佛&#xff01; 我们今天能够暂时放下世间的尘劳&#xff0c;大家在一起研究佛法的课程&#xff0c;这件事情在我们的生命当中是非常的稀有难得。 基本上&#xff0c;我们佛法的修习目的是追求身心的安乐…

基于vue的3D高德地图的引入

在引入高德地图的时候需要先注册一个账号 登录下面的网站 账号认证 | 高德控制台 (amap.com) 打开首页应用管理&#xff0c;我的应用 创建新的应用 根据自己的需求进行选择 创建完成之后&#xff0c;点击添加key 不同的服务平台对应不同的可使用服务&#xff0c;选择自己适…

3.js - 模板渲染 - 金属切面效果

md&#xff0c;狗不学&#xff0c;我学 源码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.m…

机器学习与深度学习:区别(含工作站硬件推荐)

一、机器学习与深度学习区别 机器学习&#xff08;ML&#xff1a;Machine Learning&#xff09;与深度学习&#xff08;DL&#xff1a;Deep Learning&#xff09;是人工智能&#xff08;AI&#xff09;领域内两个重要但不同的技术。它们在定义、数据依赖性以及硬件依赖性等方面…

如何在忘记密码的情况下解锁Android手机?

您的 Android 设备密码有助于保护您的数据并防止您的个人信息被滥用。但是&#xff0c;如果您被锁定在Android设备之外怎么办&#xff1f;我们知道忘记您的 Android 手机密码是多么令人沮丧&#xff0c;因为它会导致您的设备和数据无法访问。在本技术指南中&#xff0c;我们将向…

[图解]企业应用架构模式2024新译本讲解23-标识映射2

1 00:00:00,950 --> 00:00:02,890 好&#xff0c;我们往下走 2 00:00:04,140 --> 00:00:04,650 一样的 3 00:00:04,660 --> 00:00:07,170 这前面也见过了&#xff0c;定义一个对象数组 4 00:00:07,870 --> 00:00:12,820 数组的长度就是字段的数量&#xff0c;4个…

学IT上培训班真的有用吗?

在学习IT技术的过程中&#xff0c;你是否也被安利过各种五花八门的技术培训班&#xff1f;这些培训班都是怎样向你宣传的&#xff0c;你又对此抱有着怎样的态度呢&#xff1f;在培训班里学技术&#xff0c;真的有用吗&#xff1f; 一、引入话题 IT行业是一个快速发展和不断变化…

概率统计(二)

二维离散型 联合分布律 样本总数为16是因为&#xff0c;两封信分别可以放在4个信箱 边缘分布律 条件分布律 独立性 选填才能用秒杀 联合概率乘积不等于边缘概率的乘积则不独立 二维连续型 区间用一重积分面积用二重积分 离散型随机变量

Python题解Leetcode Hot100之二叉树

1. 二叉树的中序遍历 题目描述 给定一个二叉树&#xff0c;返回它的中序遍历。解题思路 使用递归的方法对左子树进行中序遍历&#xff0c;然后访问根节点&#xff0c;最后对右子树进行中序遍历。也可以使用栈来模拟递归的过程&#xff0c;迭代地进行中序遍历。代码class Solut…