以员工类为父类,经理、普通工人类均继承该类。设计属性:姓名、工龄,方法:计算工资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方法,进行相应的提示操作。
关注博主不迷路,一起走上小康路~