Java - 多态的使用

news2024/11/16 3:39:55

多态

多态基本介绍

方法或对象具有多种形态。是面向对象的三大特征,多态是建立在封装和继承基础之上的。

多态的具体体现

1、方法的多态: 重写和重载就能体现多态。

2、对象的多态:【背下来,记住】

  • 一个对象的编译类型和运行类型可以不一致

  • 编译类型在定义对象时,就已经被确定,不能再改变

  • 运行类型是可以变化的

  • 编译类型看定义时 = 号的左边,运行类型看 = 号的右边

// 可以让父类的引用指向子类的类型。
Animal animal = new Dog(); //animal编译类型是Animal, 运行类型是Dog  
animal = new Cat();    // animal的运行类型变成了Cat,编译类型仍然为Animal

多态的注意事项和细节讨论

多态的前提是:

1、两个对象(类)存在继承关系。

2、多态的向上转型

3、多态的向下转型

4、类的属性没有重写之说,当调用类的属性时,属性的值为编译类型对应的值,如果在编译类型中没有查到,则去父类中查找属性

package com.encap.poly;

public class PolyDetail {
  public static void main(String[] args) {
      Animal animal = new Dog();
      // 判断运行结果
      System.out.println(animal.count);
  }
}

class Animal{
  int count = 10;
}

class Dog extends Animal{
  int count = 20;
}

5、instanceOf比较操作符,用于判断对象的运行类型是否为 XX 类型或 XX类型的子类型

String str = "hello";
str isstanceOf Object;    // true。   判断对象的运行类型【String】 是否为 XXX(Object)类型或 XX(Object)类型的子类型。

什么叫向上转型:

1、本质:父类的引用指向了子类的对象

2、语法:父类类型 引用名 = new 子类类型();

Animal animal = new Cat();

3、使用特点:

  • 编译类型看左边,运行类型看右边。

  • 可以调用父类中的所有成员(需遵循父类的访问权限)

  • 不能调用子类中的特有成员

对上面两句的解释:在编译阶段,能调用哪些成员,是由编译类型来决定的。javac指令

  • 最终运行效果看运行类型的具体实现。 即调用成员时,按照从子类(运行类型)开始查找成员,找到则调用,找到没权限则报错。 java指令

向下转型

1、语法: 子类类型 引用名 = (子类类型) 父类引用;

Cat cat = (Cat)animal;

2、只能强转父类的引用,不能强转父类的对象。

3、要求父类的引用必须指向的是当前目标类型的对象

4、当向下转型后,可以调用子类类型中的所有成员

Animal animal = new Cat();   // 向上转型,子类的对象,指向父类的引用名
Cat cat = (Cat)animal;   // 向下转型, 将父类的引用进行强转,转成 当前目标类型的对象。    
// animal此引用名指向堆中的Cat类,这是向上转型,此时编译类型为Animal,但运行类型为 Cat    
// 向下转型则为,将堆中的Cat类重新创建一个引用,所以要求父类的引用必须指向的是当前目标类型的对象。

动态绑定机制

1、当调用对象方法的时候,该方法会对该对象的内存地址/运行类型进行绑定。即为方法从运行类型开始查找。

2、当调用对象属性时,则没有动态绑定机制,即为,属性哪个编译类调用,就用哪个编译类的属性

在这里插入图片描述

第二点是在方法中使用到属性,所以是对应着声明类。

「多态的前提」是,「类的属性没有重写之说,当调用类的属性时,属性的值直接对应编译类型得到,如果编译类型中没有,则去父类中查找属性」 。属性没有重写机制,则不需要从子类向父类查找属性,记住这两种情况即可。

测试题

package com.encap.test;

public class Test {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.getSum()); 
        System.out.println(a.getSum1()); 
    }
}

class A {
    public int i = 10;

    public int getI() {
        return i;
    }

    public int getSum() {
        return getI() + 10;
    }

    public int getSum1() {
        return i + 10;
    }

}

class B extends A{
    public int i = 20;

    public int getI() {
        return i;
    }

//    public int getSum() {
//        return getI() + 20;
//    }

//    public int getSum1() {
//        return i + 10;
//    }
}

多态数组

多态数组的定义类型为父类类型,里面保存的实际元素类型为子类类型。

package com.encap.extend_.Exercise03;

public class Test {
    public static void main(String[] args) {
        PC pc = new PC("inter", 16, 256, "IBM");

//        创建多态数组方法一:
//        Computer[] c = new Computer[2];
//        c[0] = pc;
//        c[1] = new Computer("Mac", 256, 512);
        // 创建多态数组方法二:
        Computer[] c = {pc, new Computer("Mac", 256, 512)};
        for (int i = 0; i < c.length; i++) {
            if (c[i] instanceof PC){
                // 向下转型方法一:
                ((PC)c[i]).printInfo();
                // 向下转型方法二:
//                PC p1 = (PC)c[i];
//                p1.printInfo();
            } else{
                System.out.println(c[i].getDetail());
            }
        }
    }
}


class PC extends Computer{
    private String brand;

    public PC(String CPU, int memory, int disk, String brand) {
        super(CPU, memory, disk);
        this.brand = brand;
    }

    public void printInfo(){
        System.out.println("PC信息为:");
        System.out.println(getDetail() + "品牌为: " + brand);
    }
}

class Computer {
    private String CPU;
    private int memory;
    private int disk;

    public Computer(String CPU, int memory, int disk) {
        this.CPU = CPU;
        this.memory = memory;
        this.disk = disk;
    }

    public String getDetail(){
        return "电脑的详细信息:" + "CPU: " + CPU + " 内存为: " + memory  + " 硬盘为:" + disk;
    }
}


多态参数

方法定义的形参类型为父类类型,实参类型则允许传入子类类型。

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

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

相关文章

快应用编译前如何统一替换字符串

假设你有一个需求&#xff0c;要把代码里的ad-button替换为div&#xff0c;因为是mi看ad-button不爽。 这还不简单么&#xff0c;webpack有那么多成熟的plugins和loaders&#xff0c;本身我对webpack也只是略知一二&#xff0c;随便一搜网上的解决方案&#xff0c; string-re…

【Java基础教程】(五十)JDBC篇:JDBC概念及操作步骤、主要类与接口解析、批处理与事务处理~

Java基础教程之JDBC &#x1f539;本章学习目标1️⃣ JDBC概念2️⃣ 连接数据库3️⃣ Statement 接口3.1 数据更新操作3.2 数据查询 4️⃣ PreparedStatement 接口4.1 Statement 接口问题4.2 PreparedStatement操作 5️⃣ 批处理与事务处理&#x1f33e; 总结 &#x1f539;本…

C++学习day--16 野指针和空指针

1、什么是野指针&#xff1f; 野指针就是指向的位置是不可知的&#xff08;随机的、不正确的、没有明确限制的&#xff09; 造成野指针的原因&#xff1a; 1、指针未初始化 2、指针越界 3、指针指向的空间被释放 规避野指针的方法&#xff1a; 1. 指针初始化 2. 小心指针越界…

【数据分享】2000—2022年250米分辨率逐月归一化植被指数(NDVI)数据(免费获取/全国/分省/分市)

NDVI&#xff0c;全名为Normalized Difference Vegetation Index&#xff0c;中文名称为归一化植被指数。这个指数可以用来定性和定量评价植被覆盖及其生长活力&#xff0c;我们也可以简单地将它理解为体现植被密度和健康状况的一个指标。 之前我们给大家分享过来源于MOD13A3数…

嵌入式面试常见题目收藏(超总结)

​ 这篇文章来自很多博客主和其他网站的作者&#xff0c;如有侵权&#xff0c;联系必删 文章出处标注&#xff1a; https://blog.csdn.net/qq_44330858/article/details/128947083 ***如需PDF或者原稿可私信 *** ***如需PDF或者原稿可私信 *** ***如需PDF或者原稿可私信 *** 1.…

AC+FIT(瘦AP)配置浅谈

FIT ensp实验材料 &#xff1a;pc、路由器、三层交换机、二层交换机、ac、ap 保证连通性&#xff1a; 根据ac与ap设计好的ip配置&#xff0c;使之可以通讯 ac与ap可以实现跨网段管理 1、设置三层交换机的vlan 与vlanif信息 dhcp enable //开启dhcp ip pool forap //…

Spring整合Mybatis、Spring整合JUnit

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring整合 一、Spring整合Mybatis1.1 整合Mybatis&#x…

链表刷题常用技巧——快慢指针

强大&#xff0c;不动如山的强大&#xff0c;不会输给自己的真正的强大。 往期回顾&#xff1a; 数据结构——单链表 单链表力扣刷题 文章目录 经典例题&#xff1a;链表的中间结点 题目分析及双指针思路引入 双指针图解 leetcode 核心代码 判断环形链表——快慢指针…

查看本地mysql账号密码

使用Navicat工具打开本地mysql&#xff0c;新建查询输入下面查询语句 SELECT user, authentication_string FROM mysql.user WHERE userroot将authentication_string 中的加密密码复制出来打开链接&#xff1a; Magic Data 5输入加密的密码&#xff0c;和验证码&#xff0c;点…

【目标检测】基于yolov5的水下垃圾检测(附代码和数据集,7684张图片)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就…

HDFS Erasure coding-纠删码介绍和原理

HDFS Erasure coding-纠删码介绍和原理 三副本策略弊端Erasure Coding&#xff08;EC&#xff09;简介Reed- Solomon&#xff08;RS&#xff09;码 EC架构 三副本策略弊端 为了提供容错能力&#xff0c;hdfs回根据replication factor&#xff08;复制因子&#xff09;在不同的…

可视化——安装Manim软件——试错篇

Manim: 一个数学可视化的动画引擎 官网&#xff1a;https://3b1b.github.io/manim/index.html 名词解析 python3.7是python语言的解释器, 运行python程序的环境必备品. 这个没啥说的,大家都能懂. 虽然官方建议3.7,但是我用3.8发现也没问题.考虑未来的历史进程,大伙最好还是装…

使用web-view实现网页端和uni-app端是数据传输

要实现这个功能 第一步&#xff1a;要在vue的public文件夹下面引入 <script type"text/javascript" src"https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script> 第二步&#xff1a;建立一个新的空的uni-app项目…

EP4CE6E22C8N Error: Can‘t recognize silicon ID for device 1

经过各种排查&#xff0c;发现是AS配置不对&#xff0c;仅供参考 工程 参考某处的工程画板配置的FPGA板子&#xff0c;用于学习入门FPGA。 烧录sof文件是正常的&#xff0c;并能正常运行。 但是烧录jic是failed&#xff0c;查看报错为&#xff1a;Error: Can’t recognize si…

八大排序算法--冒泡排序(动图理解)

冒泡排序 算法思路 冒泡排序的原理是&#xff1a;从左到右&#xff0c;相邻元素进行比较。每次比较一轮&#xff0c;就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 以从小到大排序为例&#xff0c;第一轮比较后&#xff0c;所有数中最大的那个数就会…

多重背包三队列优化的理解以及代码记忆:

首先是多重背包得一维朴素版本&#xff08;除了完全背包和多重背包得队列优化都是从大到小&#xff09;&#xff1a; 通过这个执行过程我们发现这个是分类更新得&#xff0c;可以按照余数是进行更新&#xff0c;而且物品数量最多有三件&#xff0c;物品数量决定了窗口的宽度所…

JAVA基础知识-进制的介绍与书写格式

1. 进制的介绍与书写格式 1.1 进制的介绍与书写格式 代码 : public class Demo1 {/*十进制&#xff1a;Java中&#xff0c;数值默认都是10进制&#xff0c;不需要加任何修饰。二进制&#xff1a;数值前面以0b开头&#xff0c;b大小写都可以。八进制&#xff1a;数值前面以0开…

TDesign中后台管理系统-访问后端服务

目录 1 修改后端服务地址2 解决跨域问题3 动态获取菜单4 测试后端接口5 前后端联调总结 目前我们已经搭建了TDesign的前端和express的后端&#xff0c;目前是两个独立的应用。通常我们需要把前后端集成在一起&#xff0c;TDesign已经配置了相关的信息&#xff0c;只需要修改后端…

内存分析工具之Mat

自定义类MatClazz内存个数为9521。当前对象占用内存为16个字节。不包括其属性bytes的字节数。 通过查看MatClazz引用的类之byte数组之bytes。其单个数组占用的字节数为10256。整个内存MatClazz中属性bytes占用的byte[]字节数为97746376&#xff0c;与直方图统计趋近。 通过选…

Mac 终端快捷键设置:如何给 Mac 中的 Terminal 设置 Ctrl+Alt+T 快捷键快速启动

Mac 电脑中正常是没有直接打开终端命令行的快捷键指令的&#xff0c;但可以通过 commandspace 打开聚焦搜索&#xff0c;然后输入 ter 或者 terminal 全拼打开。但习惯了 linux 的同学会觉得这个操作很别扭。于是我们希望能通过键盘按键直接打开。 操作流程如下&#xff1a; 1…