Java学习之多态参数

news2024/12/25 4:54:12

目录

多态参数

 父类-Employee类

子类-Worker类

子类-Manager类

Test类-要求1

main类-PolyParameter

在main类中调用Test类的showEmpAnnual(Employee e) 方法

运行结果

 Test类-要求2

代码

main方法内调用

分析

运行结果


多态参数

方法定义的形参类型是父类,实参类型可以是子类

 父类-Employee类

package com.hspedu.poly_.polyparameter;

public class Employee {
    private String name;
    private double monthsal;

    public Employee(String name, double monthsal) {
        this.name = name;
        this.monthsal = monthsal;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMonthsal() {
        return monthsal;
    }

    public void setMonthsal(double monthsal) {
        this.monthsal = monthsal;
    }
    //计算年工资
    public double getAnnual(){
        return monthsal * 12;
    }
}

子类-Worker类

package com.hspedu.poly_.polyparameter;

public class Worker extends Employee{
    public Worker(String name, double monthsal) {
        super(name, monthsal);
    }
    //重写

    @Override
    public double getAnnual() {
        //普通员工没有其他收入
        return super.getAnnual();
    }
    //work方法
    public void  work(){
        System.out.println("员工" + getName() + "正在工作");
    }
}

子类-Manager类

package com.hspedu.poly_.polyparameter;

public class Manager extends Employee{
    private double bonus;

    public Manager(String name, double monthsal, double bonus) {
        super(name, monthsal);
        this.bonus = bonus;
    }

    public double getBonus() {
        return bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }
    //重写

    @Override
    public double getAnnual() {
        //管理者是工资+奖金
        return super.getAnnual() + bonus;
    }

    public void manage(){
        System.out.println("经理" + getName() + "负责财务方面的管理");
    }
}

Test类-要求1

测试类中添加一个方法showEmpAnnual(Employee e) ,实现获取任何员工对象的年工资并在main方法中调用该方法[e.getAnnual()]

package com.hspedu.poly_.polyparameter;

public class Test {
    //测试类中添加一个方法showEmpAnnual(Employee e)
    //实现获取任何员工对象的年工资并在main方法中调用该方法[e.getAnnual()]

    public void showEmpAnnual(Employee e) {
        System.out.println(e.getAnnual());
    }
}

main类-PolyParameter

在main类中创建Woker类和Manager类的新对象,并完成对象属性的初始化

package com.hspedu.poly_.polyparameter;

public class PolyParameter {
    public static void main(String[] args) {
        Worker bobby = new Worker("Bobby", 5000);
        Manager carol = new Manager("Carol", 12000, 80000);
        
    }
}

在main类中调用Test类的showEmpAnnual(Employee e) 方法

package com.hspedu.poly_.polyparameter;

public class PolyParameter {
    public static void main(String[] args) {
        Worker bobby = new Worker("Bobby", 5000);
        Manager carol = new Manager("Carol", 12000, 80000);
        //PolyParameter polyParameter = new PolyParameter();
        Test test = new Test();
        //员工工资
        test.showEmpAnnual(bobby);
        test.showEmpAnnual(carol);
      
    }
}




运行结果

 Test类-要求2

测试类中添加一个方法,testWork,如果是普通员工, 则调用work方法,如果是经理,则调用manage方法

代码

package com.hspedu.poly_.polyparameter;

public class Test {
    //测试类中添加一个方法showEmpAnnual(Employee e)
    //实现获取任何员工对象的年工资并在main方法中调用该方法[e.getAnnual()]

    public void showEmpAnnual(Employee e) {
        System.out.println(e.getAnnual());
    }

    //测试类中添加一个方法,testWork,如果是普通员工,
    //则调用work方法,如果是经理,则调用manage方法
    public void testWork(Employee e) {
        if (e instanceof Worker) {
            //向下转型,然后调用
//            Worker worker = (Worker) e;
//            worker.work();
            //合并上述两句话
            ((Worker) e).work();
        } else if (e instanceof Manager) {
            ((Manager) e).manage();
        }
    }
}

main方法内调用

package com.hspedu.poly_.polyparameter;

public class PolyParameter {
    public static void main(String[] args) {
        Worker bobby = new Worker("Bobby", 5000);
        Manager carol = new Manager("Carol", 12000, 80000);
        //PolyParameter polyParameter = new PolyParameter();
        Test test = new Test();
        //员工工资
        test.showEmpAnnual(bobby);
        test.showEmpAnnual(carol);
        //调用子类特有的方法
        //bobby的运行类型是
        //在传参的时候把bobby传给e,就是Employee e=bobby,
        // 完成了一个向上转型,所以在调用的时候还要一次向下转型
        test.testWork(bobby);
        test.testWork(carol);
    }
}




 

分析

方法testWork的形参是(Employee e),实参是传入的bobby或者是carol,执行传参的时候程序执行

Employee e = bobby;也就是让父类的引用类型指向子类的对象,即向上转型,所以在方法内需要先向下转型,然后调用

运行结果

 

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

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

相关文章

青竹画材创业板IPO被终止:年营收4.15亿 文投基金是股东

雷递网 雷建平 12月8日河北青竹画材科技股份有限公司(简称:“青竹画材”)日前IPO被终止。青竹画材曾计划募资4.1亿元,其中,3.08亿元用于美术画材产能扩建项目,2317.35万元用于研发中心项目,7966…

Selenium+python常见问题,闪退,找不到元素

1、闪退问题: 由于缺少浏览器对应驱动。谷歌:chromedriver驱动;火狐:geckodriver驱动 查看Chrome版本 查找Chrome和ChromeDriver的对应关系 打开Chrome,在设置 – 关于Chrome下载对应ChromeDriver ChromeDriver下载…

本地存储:localStorage,sessionStorage,和cookie。区别

localStorage: 特点: 永久存储支持跨页面通讯,也就是在其他页面同样可以获取到你存好的数据。只能存储字符串类型的数据,不能存储复杂数据类型 sessionStorage: 特点: 临时存储,会话级别&am…

68. 关于 SAP ABAP 报表的多语言显示问题

文章目录 SAP 标准程序的多语言显示支持自开发 Screen 的字段,如何实现多语言显示呢?总结最近一个朋友向我发起知乎咨询,询问 SAP ABAP 报表的字段文本,到底是存储在哪些数据库表里的。 随着后来笔者同这位朋友的深入沟通,得知这位朋友询问的问题背后,实际上包含了一个重…

Windows系统还原失败该怎么办?

系统还原是Windows系统中一个强大的实用程序,它允许您将系统回退到以前的时间点及状态。该功能可以用来撤销对系统所做的一系列更改,比如,当您执行了驱动程序的更新后,计算机出现了异常,您就可以通过系统还原的操作将系…

【微服务】1、一篇文章了解 Eureka 注册中心(理论加代码)

Eureka 的作用和案例使用一、Eureka 的作用(注册中心)二、Eureka 代码(1) 搭建 Eureka 注册中心① 创建项目,引入 spring-cloud-starter-netflix-eureka-server 依赖【eureka 服务端依赖】② 编写 eureka 服务端启动类(启动类添加…

WSO2使用Jenkins进行CI/CD

WSO2使用Jenkins进行CI/CD1. Tool Install1.0 Port 1.1 wso2 Install 1.2 Tool Install(git/vim/jenkins)2. Jenkins CI/CD2.1 Apictl Command2.1 Apictl Command5.2.1 Setting up the environment5.2.2 Setup repository5.2.3 Setup JFrog Artifactory5.2.4 Configure Jenkins…

计算机网络复习(四)

4-15.一个3200位长的TCP报文传到IP层,加上160位的首部后成为数据报。下面的互联网由两个局域网通过路由器连接起来。但第二个局域网所能传送的最长数据帧中的数据部分只有1200位。因此数据报在路由器必须进行分片。试问第二个局域网向其上层要传送多少比特的数据&am…

JavaScript进阶教程——原始类型与引用类型、对象拷贝(克隆)

文章目录序原始类型与引用类型基本概念两种类型的区别赋值比较函数传参对象拷贝对象克隆的使用场景:对象拷贝的分类:浅拷贝深拷贝序 解决JavaScript中比较烧脑的问题: 原始类型与引用类型闭包原型对象this关键字bind、apply、call异步编程 …

VMware Workstation 17.0 Pro SLIC Unlocker for Windows

VMware_Dell_2.6_BIOS-EFI64_Mod;macOS Unlocker,支持 macOS Ventura 请访问原文链接:VMware Workstation 17.0 Pro SLIC & Unlocker for Windows & Linux,查看最新版。原创作品,转载请保留出处。 作者主页&…

Win11安装Linux子系统提示错误代码0x800701bc怎么办?

Win11安装Linux子系统提示错误代码0x800701bc怎么办?最近有用户想要在自己的电脑上安装一个Linux子系统来使用,但是在安装的过程中却出现了一些问题,提示错误代码0x800701bc。那么这个情况要怎么去处理,一起来看看解决的操作步骤吧…

GitHub 被超火的 ChatGPT 霸榜!

本期推荐开源项目目录:1. ChatGPT2. 基于 Node.js 的 ChatGPT3. Mac 版的 ChatGPT4. Chrome 插件的 ChatGPT最近 ChatGPT 火爆全球,估计各位的朋友圈都被这东西刷屏了吧。Chat GPT 是 OpenAI 推出的基于 GPT-3 技术的聊天机器人。它能自动理解用户发的消…

小度机器人3D数字勋章盲盒发售!抽盲盒,赢奖金!参与合成得稀有!

人气王小度机器人3D数字勋章盲盒来了!玩法升级,福利更多!参与活动,抽超限量稀有款,赢京东卡福利,更能合成珍藏款勋章!【活动介绍】小度机器人是百度公司推出的智能交互机器人,依托百…

C++语法——详解智能指针的概念、实现原理、缺陷

目录 一.智能指针的概念 (一).智能指针的历史 (二).智能指针的使用 插曲.auto_ptr ①unique_ptr ②shared_ptr ③weak_ptr 二.智能指针的实现 三.智能指针的缺陷 (一).循环引用 (二&…

ChatGPT被玩坏了

大家好,欢迎来到 Crossin的编程教室 ! 体验了一下最近火出圈的 ChatGPT,聊聊使用感受。 ChatGPT让我下岗?原理就不展开说了,因为我也不懂,写出来估计大家也都看不懂,就简单复制一段网上的介绍&…

Unity 如何实现卡片循环滚动效果

文章目录简介定义卡片的摆放规则调整卡片的层级关系调整卡片的尺寸大小动态调整位置、层级和大小移动动画按钮事件简介 功能需求如图所示,点击下一个按钮,所有卡片向右滚动,其中最后一张需要变更为最前面的一张,点击上一个按钮&a…

案例:用户信息列表展示

1. 需求:用户信息的增删改查操作2. 设计:1. 技术选型:ServletJSPMySQLJDBCTempleatDuirdBeanUtilStomcat2. 数据库设计:create database day17; -- 创建数据库use day17; -- 使用数据库create table user( -- 创建表id in…

Java5分钟制作海报

一、需求背景我们经常在多终端应用开发中会遇到这样的需求:用户在浏览商品时觉得不错,希望分享给朋友。此时终端(安卓、苹果、H5等)生成一张精美的商品海报,通过微信或者其他途径分享给他人。也可能会遇到需求&#xf…

排课算法小记

输出: 在配置文件(config.txt)中配置:老师,课程,专业班级,课时的信息,运行test.py自动生成对应班级课程表 eg: 专业1,四门课,每门课每周2课时,共8门课 专业2,四门课,每…

springcloud(服务消费及熔断)

目录 1. 服务消费方式 1.1 RestTemplate1.2 feign2. 服务熔断(降级) 2.1 在微服务架构中服务熔断的必要性2.2 hystrix2.3 hystrix的使用 1. 服务消费方式 1.1 RestTemplate 传统情况下在java代码里访问restful服务,一般使用Apache的HttpClie…