Java学习之多态一

news2024/11/17 16:03:50

目录

一、入门案例

 Food类

Animal类 

Master类

运行测试

分析

运行结果

 问题总结

二、方法的多态

三、对象的多态(重难点/核心)

四个非常重要的知识点(背诵)

举例说明

父类-Animal类

子类-Dog类

子类-Cat类

运行-PolyObject类

运行结果

​编辑 分析

改变运行类型

分析

运行结果

举例说明


多态是建立在封装和继承至上的,是面向对象中最难的部分

一、入门案例

主人需要给自己的不同的宠物喂不同的食物

建立Food类(包括子类Bone和Fish),Animal类(包括子类Dog、Cat),Master类

和Poly01(测试运行)

 Food类

package com.hspedu.poly_;

public class Food {
    private String name;

    public Food(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.hspedu.poly_;

public class Fish extends Food{
    //需要继承父类的构造器
    public Fish(String name) {
        super(name);
    }
}
package com.hspedu.poly_;

public class Bone extends Food{
    public Bone(String name) {
        super(name);
    }
}

Animal类 

package com.hspedu.poly_;

public class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package com.hspedu.poly_;

public class Cat extends Animal{
    public Cat(String name) {
        super(name);
    }
}
package com.hspedu.poly_;

public class Dog extends Animal{
    public Dog(String name) {
        super(name);
    }
}

Master类

package com.hspedu.poly_;

public class Master {
    private String name;

    public Master(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    //有一个feed方法,完成主人给动物喂食的动作
    public void feed(Dog dog, Bone bone){
        //dog.getName()继承自Animal的getName;
        //fish.getName()继承自Food的getName;
        System.out.println("主人" + name + "给小狗"+ dog.getName() + "喂" + bone.getName());

    }
    public void feed2(Cat cat, Fish fish){
        System.out.println("主人" + name + "给小猫"+ cat.getName() + "喂" + fish.getName());
    }
}

运行测试

package com.hspedu.poly_;

public class Poly01 {
    public static void main(String[] args) {
        Master master = new Master("小李");
        Dog spike = new Dog("Spike");
        Bone bone = new Bone("大骨头");
        master.feed(spike,bone);
        Cat tom = new Cat("Tom");
        Fish fish = new Fish("鱼罐头");
        master.feed2(tom,fish);
    }
}

 上述代码中的

        Master master = new Master("小李");
        Dog spike = new Dog("Spike");
        Bone bone = new Bone("大骨头");
        master.feed(spike,bone);

分析

对象引用master调用feed方法,此时需要传入一个Dog类变量和一个Bone类变量,即spike和bone

章节7.3.1基本数据类型的传参机制


//创建 AA 对象 名字 obj
int a = 10;
int b = 20;
AA obj = new AA();
obj.swap(a, b); //调用 swap

swap()方法

 public void swap(int a,int b){

 }

创建新对象obj,然后创建两个int型变量a,b,然后传参调用

运行结果

 问题总结

如果多几个宠物多几种食物就需要一直创建新的类和新的方法,不利于管理和维护

此时就需要多态来解决这个问题

二、方法的多态

package com.hspedu.poly_;

public class PolyMethod {
    public static void main(String[] args) {
        //方法重载体现多态
        A a = new A();
        //传入的参数个数不同,调用不同的sum方法
        //就是sum方法多重状态的体现
        System.out.println(a.sum(10,20));
        System.out.println(a.sum(10,20,30));

        //方法的重写体现出多态
        B b = new B();
        //两者会调用不同的say()方法,体现出say()方法的多态
        a.say();
        b.say();
    }
}

class B { //父类
    public void say() {
        System.out.println("B say() 方法被调用...");
    }
}

class A extends B {//子类

    public int sum(int n1, int n2) {//和下面 sum 构成重载
        return n1 + n2;
    }

    public int sum(int n1, int n2, int n3) {
        return n1 + n2 + n3;
    }

    public void say() {
        System.out.println("A say() 方法被调用...");
    }
}

方法重载体现多态: 传入的参数个数不同,调用不同的sum方法,就是sum方法多重状态的体现

方法的重写体现出多态:两者会调用不同的say()方法(一个子类,一个父类),体现出say()方法的多态


三、对象的多态(重难点/核心)

四个非常重要的知识点(背诵)

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

2.编译类型在定义对象时就确定了,不能改变,

3.运行类型是可以变化的

4.编译类型看定义时“=”的左边,运行类型看“=”的右边

举例说明

父类-Animal类

package com.hspedu.poly_.objectpoly_;

public class Animal {
    public void cry() {
        System.out.println("Animal cry()动物在叫...");
    }
}

子类-Dog类

package com.hspedu.poly_.objectpoly_;

public class Dog extends Animal{
    @Override
    public void cry() {
        System.out.println("Dog cry()小狗汪汪叫...");
    }
}

子类-Cat类

package com.hspedu.poly_.objectpoly_;

public class Cat extends Animal{
    @Override//重写的注解
    public void cry() {
        System.out.println("Cat cry()小猫喵喵叫...");
    }
}

运行-PolyObject类

package com.hspedu.poly_.objectpoly_;

public class PolyObject {
    public static void main(String[] args) {
        
        Animal animal = new Dog();
        animal.cry();
    }
}

运行结果


 分析

Animal animal = new Dog();

animal的编译类型(javac的时候)是Animal运行类型(java的时候)是Dog

animal.cry();

调用的是Dog的cry,因为运行时,执行到该行的时候,animal的运行类型Dog, 所以cry就是Dog的cry

改变运行类型

package com.hspedu.poly_.objectpoly_;

public class PolyObject {
    public static void main(String[] args) {

        Animal animal = new Dog();
        animal.cry();
        animal = new Cat(); 
        animal.cry();
    }
}

分析

编译类型不变,运行类型变成了Cat,本质是看堆内真正的对象,所以animal.cry()调用的Cat类的方法

运行结果

 

举例说明

披着羊皮的狼 ,表面是羊(编译类型),实际是狼(运行类型)

披着狼皮的羊,表面是狼(编译类型),实际是羊(运行类型)

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

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

相关文章

如何将数据库从 CloudKit 迁移到 Firebase

为什么要迁移 如果该服务仅支持 Apple 设备,则使用 CloudKit 和 CoreData 可能是最佳选择。但是,如果您还需要支持 Web 和 Android,情况就不同了。 当同时支持Web和Android时,可以使用CloudKit JS访问iCloud DB。但是实施起来比较困难,需要有苹果账号。 如果未来有同时支…

【滤波跟踪】基于北方苍鹰和粒子群算法优化粒子滤波器实现目标滤波跟踪附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

[nacos]nacos2.x+nginx集群搭建以及过程中遇到的坑

参考文档 nacos官方集群部署说明centos7安装并配置jdknacos2.x集群实现centos7安装mysql8使用nginx反代nacos报错 badrequest 400 环境准备 vmware虚拟机上跑的centos7 (原本内存2g 坑点之一!2g内存无法启动三台nacos集群,官方说明需要4g)centos7安装并配置jdk8 安装教程参考 …

Mongoose【node.js的优雅mongodb对象建模】

Mongoose基础运行流程: 文章目录Mongoose基础运行流程:官方 Docs 地址1. 安装:2. 使用:2.1 目录结构:2.2 初始化连接实例 [ 创建 DBHelper.js ]2.2.1 链接地址书写格式[ mongoose.connect(参数格式 &#x…

java计算机毕业设计ssm网络相册设计sepo8(附源码、数据库)

java计算机毕业设计ssm网络相册设计sepo8(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。…

机器学习笔记之受限玻尔兹曼机(四)推断任务——边缘概率

机器学习笔记之受限玻尔兹曼机——推断任务[边缘概率]引言回顾:场景构建推断任务——边缘概率求解边缘概率与Softplus函数引言 上一节介绍了受限玻尔兹曼机中随机变量节点的后验概率,本节将介绍随机变量结点的边缘概率。 回顾:场景构建 已…

木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖

木聚糖-氨基|Xylan-NH2|木聚糖-聚乙二醇-氨基|氨基-PEG-木聚糖 Xylan-NH2 木聚糖-氨基 中文名称:木聚糖-氨基 英文名称:Xylan-NH2 别称:氨基修饰木聚糖,氨基-木聚糖 PEG分子量可选:350、550、750、1k、2k、34k、5…

统计学-双变量相关分析-相关系数、相关比、克莱姆相关系数

双变量相关分析根据变量的数据类型不同而不同。当数值数据和数值数据计算相关性时,指标为相关系数;数值数据和类别数据计算相关性时,指标为相关比;类别数据和类别数据计算相关性时,指标为克里姆相关系数。 1 计算公式…

基于现代深度学习的目标检测方法综述

论文地址:A Survey of Modern Deep Learning based Object Detection Models 论文结构: 一、论文亮点(与其他综述不同): 1、深度分析了两类检测方法:单步和两步检测,并从历史的角度分析&…

【covid 时间序列】基于matlab GUI冠状病毒病例、死亡、疫苗接种仿真【含Matlab源码 2262期】

一、⛄SEIR模型简介 1 SEIR模型简介 如果所研究的传染病有一定的潜伏期,与病人接触过的健康人并不马上患病,而是成为病原体的携带者,归入 E 类。此时有: 仍有守恒关系 S(t) E(t) I(t) R(t) 常数,病死者可归入 R…

Vue3 快速入门及巩固基础

1. Vue 框架介绍 2. Vue3 安装方式 3. Vue3 模板语法 4. 组件的 data 属性 5. 计算属性和方法 6. 侦听器的使用 7. class 类名绑定对象 8. class 类名绑定数组 9. style 样式绑定对象 10. style 样式绑定数组 11. 条件渲染 v-if 和 v-show 12. 列表渲染 v-for 13. …

1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯;TPE-MB结构式

中文名称:1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯 中文同义词:1,2-双(4-(溴甲基)苯基)-1,2-二苯乙烯; 分子式:C28H22Br2 分子量:518.28 CAS:1053241-67-0 1,2-二苯基-1,2-二(4-苄溴基苯基)乙烯化学性质 沸点 :533.545.0 C(Predicted) 密度 &#xff…

医依通小程序项目总结

一、项目介绍: 这是一个医疗类的小程序,主要用于新冠疫苗预约,HPV疫苗预约,核酸预约,和咨询等,主要作用就是方便快捷,可以在手机上进行预约挂号,和一些健康自测的功能,还…

MySQL的零拷贝技术

1.需要了解Buffer 与 cache 的区别 Bbuffer 与 Cache 非常类似,因为它们都用于存储数据数据,被应用层读取字节数据。在很多场合它们有着相同的概念: 首先从翻译上,Buffer应该翻译为“缓冲”,Cache应该翻译为“缓存”&#xff0c…

高企技术企业对企业的作用

高新技术企业认定的作用 1、促进企业科技转型 创新是企业发展的根本动力,高新技术企业认定政策是一项引导政策,目的是引导企业调整产业结构,走自主创新、持续创新的发展道路,激发企业自主创新的热情,提高科技创新能力…

堆排序(大根堆与小根堆)

(1)是什么? 是一种适用于关键字较多的情况下的排序算法,例如在十亿个数中选出前1000个最大值或者最小值 如果在传统的排序算法中(例如冒泡,插入等),我们习惯把目标数据整体进行一次…

Cisco ASA应用——NAT的类型

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.NAT的类型 1.动态NAT 2.静态NAT 3.静态PAT 4.动态PAT 前言…

爱奇艺:基于龙蜥与 Koordinator 在离线混部的实践解析

在 2022 云栖大会龙蜥峰会云原生专场上,来自爱奇艺的基础架构研究员赵慰分享了《基于龙蜥与 Koordinator 的在离线混部实践》技术演讲,以下为本次演讲内容: 一、爱奇艺离线业务混部背景 与众多互联网公司一样,爱奇艺常见的负载类…

WSN final fighting 12.05

0.网络时间协议(NTP) p54 1.Min-Max定位 p63 2.质心算法定位 p64 3.覆盖修复过程 p95 4.数据融合的卡尔曼滤波法 p72 5.数据融合的神经网络算法 p73 6.TMAC协议 p135 7.基于分分簇网络的MAC协议 p140 8.蓝牙协议 p170 9.GEM路由协议 p206 10.MECN路由协议 p206 11.阐…

INTERSPEECH 2022——基于层级上下文语义信息的多尺度语音合成风格建模

本文由清华大学与虎牙信息科技有限公司、元象唯思控股(深圳)有限公司和香港中文大学合作。 人类语音的风格表达是多尺度的,不仅包括全局尺度的情感表达,还包括局部尺度的韵律表达。 而现有关于表现力语音合成的工作只考虑了单一尺…