以员工类为父类,经理、普通工人类均继承该类。设计属性:姓名、工龄,方法:计算工资getSalary( ) 。

以员工类为父类,经理、普通工人类均继承该类。设计属性:姓名、工龄,方法:计算工资getSalary

题目介绍

以员工类为父类,经理、普通工人类均继承该类。设计属性:姓名、工龄,方法:计算工资getSalary( ) 。

员工基本工资=3000+工龄*20;
经理工资=基本工资+经理津贴(3000)
普通工人工资=基本工资+工人津贴(1000)

要求:1、创建父类,实现getSalary()
2、创建 经理类和工人类,并实现方法的覆盖
3、创建Test类,创建printSalary()方法,运用多态打印输出员工的工资

简洁版

可实现基本的功能,能完成作业要求,无输入和输出。对一些奇葩要求没有提示,细节处理不到位。

class Employee {
    private String name;
    private int workYears;
    private double salary;
    public Employee(String name,int years){
        this.name=name;
        this.workYears=years;
    }

    public String getName() {
        return name;
    }

    public double getSalary(){
        salary=3000+workYears*20;
        return salary;
    }
}

class Manager extends Employee{
    static final double allowanceM=3000;
    Manager(String name,int years){
        super(name,years);
    }
    public double getSalary(){
        return super.getSalary()+allowanceM;
    }
}
class Worker extends Employee{
    static final double allowanceW=1000;
    Worker(String name,int years){
        super(name,years);
    }
    public double getSalary(){
        return super.getSalary()+allowanceW;
    }
}


public class Staff {
    public static void prt(Employee e){
        System.out.println("姓名:"+e.getName());
        System.out.println("工资:"+e.getSalary());

    }
    public static void main(String[] args) {
        Staff.prt(new Manager("小爱同学",20));
        Staff.prt(new Worker("小艺同学",10));
    }

}

运行效果如下:
运行效果

进阶版

对原有功能进行拓展,可实现员工的姓名,年龄进行输入的功能,同时应用字符串的判断进行判断操作者是经理还是普通员工,同时对一些奇葩输入进行提示操作。代码的安全性和健壮性大幅提示。

import java.util.InputMismatchException;
import java.util.Scanner;
public class Staff {
    String name;
    int age;
    int salary;
    public void setName(String name){
        this.name=name;
    }
    public int getAge(){
        return age;
    }
    /**
     * 获取年龄值
     * @param age
     * @return 年龄或者相关提示语句
     */
    public String setAge(int age){
        if(age>=18&&age<=60){
            this.age=age;
            return null;//作为一个标记,后续会进行判断
        }
        else if(age<18) {
            this.age=age;
            return "未成年人要以学业为重~";
        }
        else if(age>60){
            this.age=age;
            return "您已退休~";
        }
        else{
            return "未知错误!";
        }
    }
    public int getSalary(){
        salary = 3000 + (20 * this.age);
        return salary;
    }
}
class Manager extends Staff{
    /**
     * 调用父类setName函数对姓名进行赋值
     * @param name
     */
    public void setName(String name){
        super.setName(name);
    }

    /**
     * 调用父类setAge函数对年龄进行赋值ji
     * @param age
     * @return 年龄或者提示语句
     */
    public String setAge(int age){
        return super.setAge(age);
    }

    /**
     * //调用父类setSalary计算工资
     * @return 工资
     */
    public int getSalary(){
        //不符合公司的条件,同时赋值为0
        if(this.age<18||this.age>60){
            salary=0;
        }//符合公司的条件并进行计算
        else if(this.age>=18&&this.age<=60){
            salary=super.getSalary()+3000;
        }
        else{
            System.out.println("未知错误!");
        }
        return salary;
    }
}
class Worker extends Staff{
    /**
     * 调用父类setName函数对姓名进行赋值
     * @param name
     */
    public void setName(String name){
        super.setName(name);
    }

    /**
     * 调用父类setAge函数对年龄进行赋值
     * @param age
     * @return 年龄或者提示语句
     */
    public String setAge(int age){
        return super.setAge(age);
    }
    /**
     * //调用父类setSalary计算工资
     * @return 工资
     */
    public int getSalary(){
        //不符合公司的条件,同时赋值为0
        if(this.age<18||this.age>60){
            salary=0;
        }//符合公司的条件并进行计算
        else if(this.age>=18&&this.age<=60){
            salary=super.getSalary()+1000;
        }
        else{
            System.out.println("未知错误!");
        }
        return salary;
    }
}

/**
 * 测试类
 */
class Test{
    public static void main(String[] args) {
        test();
    }

    /**
     * 将主要测试方法写成test函数,如果发生异常,可重新进入本函数进行重新输入
     * 若程序正常运行,则正常结束运行
     */
    public static void test(){
        /**
         * 设立flag为true,作为程序正常运行的标志
         * 若发生异常,则设置flag为false
         * 在程序最后进行flag的判断,如果为false,则重新进入test方法
         * 设置try...catch,对异常语句进行捕获
         */
        boolean flag = true;
        try{
            Scanner cin = new Scanner(System.in);
            System.out.println("请输入您的职位:经理 / 普通工人 ");
            String s=cin.next();
            /**
             * 使用字符串的equals()对字符串进行比较,但是不能使用==进行判断
             * ==使用的是两个字符串对象的地址是否相同
             * equals()用于比较两个字符串的字符是否相等
             */
            if(s.equals("经理")||s.equals("普通工人")){
                System.out.print("请输入您的姓名:");
                String name=cin.next();
                System.out.print("请输入您的年龄:");
                int age=cin.nextInt();
                /**
                 * 默认IfAge是null,即符合公司条件,若不符合条件会重新赋值
                 * 默认父类Staff对象staff是null
                 * 以上均为个人代码习惯
                 */
                String IfAge=null;
                Staff staff=null;
                /**
                 * 输入经理后,进入经理区,进行年龄判断和获取工资
                 * 输入 普通工人 后,进入 普通工人区,进行年龄判断和获取工资
                 */
                if(s.equals("经理")){
                    staff=new Manager();
                    IfAge=staff.setAge(age);
                    staff.getSalary();
                }else if(s.equals("普通工人")){
                    staff=new Worker();
                    IfAge=staff.setAge(age);
                    staff.getSalary();
                }
                /**
                 * 使用多态进行输出
                 */
                System.out.println(name+"的基本信息");
                System.out.println("年龄:"+staff.age);
                System.out.println("工资"+staff.salary);
                if(IfAge!=null){
                    System.out.println(IfAge);
                }
            }
            /**
             * 在职位判断时,如果不是输入的经理或者普通工人,会赋值flag为false,同时输出提示语句,进入finally代码块
             */
            else {
                System.out.println("职位类型错误~");
                flag=false;
            }
            /**
             * 利用try...catch对异常语句进行捕获
             * 同时输出相应的提示语句
             * InputMismatchException为错误类型,正常输入为int型,但赋值了其他类型
             * 在catch代码块中增加了提示语句,同时结束当前方法
             * 进入finally代码块
             */
        }catch (InputMismatchException e){
            flag=false;
            System.out.println("你输入的内容不符合要求");
            /**
             * try...catch结束之后,会进入finally区
             *try...catch是配对使用,finally可有可无
             * 但要使用finally,必须要有try...catch
             * 在try...catch捕捉到异常处理之后,赋值flag为false
             */
        }finally {
            if(!flag) {
            System.out.println("请重新输入所有内容!");
            test();
            }
        }
    }
}

运行效果如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

相关知识点

输入语句

1.导入输入用到的包:一般放在类外

import java.util.Scanner;

2.创建 Scanner 对象 , new 创建一个对象

Scanner cin = new Scanner(System.in);

其中,cin就表示一个对象(刚学完C++,暂时想不到其他合适的对象名)
3.确定输入的对象的数据类型

 System.out.print("请输入您的姓名:");
 String name=cin.next();
 System.out.print("请输入您的年龄:");
 String IfAge=manager.cin.nextInt();

输入字符串用next(),输入整数型用nextInt()
一般在软件中会有弹框,可进行选择,右侧是输出的数据类型
在这里插入图片描述

super调用方法

当子类继承父类之后,可以用super关键字调用父类的普通属性、方法和构造方法。
父类的getAge方法

public String setAge(int age){
        if(age>=18&&age<=60){
            this.age=age;
            return null;//作为一个标记,后续会进行判断
        }
        else if(age<18) {
            return "未成年人要以学业为重~";
        }
        else if(age>60){
            return "您已退休~";
        }
        else{
            return "未知错误!";
        }
    }

子类的getAge方法去调用父类的该方法

public String setAge(int age){
        return super.setAge(age);
    }

super关键字访问父类的成员变量和成员方法,具体格式如下
super.成员变量
super.成员方法(参数1,参数2…)

try…catch和finally

在进行输入时,setAge中传入的形参是int类型,如果输入其他类型,则程序必然会进行报错。如下图所示
报错图片
在报错之后,程序也会无法继续执行,故需要使用try…catch对错误进行提示处理。
try…catch具体语法如下:

try{
//程序代码块
}catch(异常类型 e){
//对该异常类型进行处理或者提示的代码块
}

异常类型在运行时,可直接通过控制台看出。如上述图片中,错误类型即InputMismatchException。在执行完catch语句之后,该方法也会停止运行,进入finally代码块。不论程序是否正常运行,finally中的语句都会执行因此,通常会使用finally代码块处理必须做的事情。
try…catch是配对使用,finally可有可无,不写finally代码块默认为空,但使用finally时,必须要有try…catch需要注意的是,finally中的代码块在一种情况下是不会执行的,那就是在try…catch中执行了System.exit(0)语句。该语句表示退出当前的java虚拟机,若java虚拟机停止了,那任何代码都不能执行了。

flag标记

在使用flag标记时,flag标记的插放位置要逻辑清楚,在主方法执行时,可赋初值flag默认为true,作为程序正常运行的标记。如果有异常处理,就赋值flag为false,比如在catch捕捉到的异常情况,或者在输入职位的时候,都可对flag进行更改。
finally必然会执行,那可在finally代码块中对flag进行判断,如果flag为true,则正常结束运行,如果为false,则可以重新执行该方法。

异常处理和提示

正常公司都不招未成年人,而且年龄大了也会退休,考虑到这点,故进行异常提示。
本文中对年龄进行判断和处理,如果小于18周岁,提示”未成年人要以学业为重~“,如果大于60周岁,提示”您已退休“。如果不属于正常工作年龄段,则不进行赋值,返回相应的提示。如果属于正常工作年龄段,进行赋值,并return null。因为提示性文字是字符串,所以setAge的类型为String,而并非int。
在输出年龄时,判断输入的年龄IfAge==null是否成立,如果是真,则输出相应的年龄信息。如果不成立,则进入setAge方法,进行相应的提示操作。

关注博主不迷路,一起走上小康路~

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
某公司雇员(Employee)包括经理(Manager),技术人员(Technician)和销售员(Salesman)。开发部经理(DeveloperManger),既是经理也是技术人员。销售部经理(SalesManager),既是经理也是销售员。 以Employee类为虚基派生出Manager,Technician和Salesman;再进一步派生出Developermanager和Salesmanager。 Employee属性包括姓名、职工号、工资级别,月薪(实发基本工资加业绩工资)。操作包括月薪计算函数(pay()),该函数要求输入请假天数,扣去应扣工资后,得出实发基本工资。 Technician派生的属性有每小时附加酬金和当月工作时数,及研究完成进度系数。业绩工资为三者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。 Salesman派生的属性有当月销售额和酬金提取百分比,业绩工资为两者之积。也包括同名的pay()函数,工资总额为基本工资加业绩工资。 Manager派生属性有固定奖金额和业绩系数,业绩工资为两者之积。工资总额也为基本工资加业绩工资。 而DeveloperManager,pay()函数是将作为经理和作为技术人员业绩工资之和的一半作为业绩工资。 SalesManager,pay()函数则是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。 编程实现工资管理。特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A十点差三分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值