继承、接口的实现

一、某公司的雇员分为以下若干类

        1.父类Employee

        这是所有员工总的父类,
            属性:员工的姓名,员工的生日月份。
            方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。

创建Employee

public abstract class Employee {
    private String name;//员工姓名
    private int month;//员工的生日月份

    //结算工资
    public abstract void  getSalary(int month);

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", month=" + month +
                '}';
    }

    public Employee() {
    }

    public Employee(String name, int month) {
        this.name = name;
        this.month = month;
    }

    public String getName() {
        return name;
    }

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

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }
}

        2.父类为 Employee的子类SalariedEmployee

                SalariedEmployee:
                    Employee的子类,拿固定工资的员工。
                    属性:月薪

                创建SalariedEmployee

/**
 * 拿固定工资的员工
 * 月薪结算工资的员工
 */
public class SalariedEmployee extends Employee{
    private double monthlySalary;//月薪
    @Override
    public void getSalary(int month) {
        //根据参数月份判断员工是否生日
        if(this.getMonth() == month){
            System.out.println(this.getName()+"本月生日,奖励100"+"本月工资为:"+(monthlySalary+100));
        }else {
            System.out.println(this.getName()+"本月工资为:"+monthlySalary);
        }
    }

    public SalariedEmployee() {
    }

    public SalariedEmployee(double monthlySalary) {
        this.monthlySalary = monthlySalary;
    }

    public double getMonthlySalary() {
        return monthlySalary;
    }

    public void setMonthlySalary(double monthlySalary) {
        this.monthlySalary = monthlySalary;
    }
}

        3.父类为 Employee的子类HourlyEmployee

         HourlyEmployee:
         Employee的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5倍工资发放。
         属性:每小时的工资、每月工作的小时数

                创建 HourlyEmployee

/**
 * 小时结算的工资
 *  每月工作超出160小时的部分按照1.5倍工资发放
 */
public class HourlyEmployee extends Employee{
    private double wage;//每小时的工资
    private double hour;//每月工作的小时数

    public void settlement(){

    };
    @Override
    public void getSalary(int month) {
        if(hour>160){
            if(month == getMonth()){
                System.out.println(this.getName()+"本月工作时长大于160小时且本月生日,奖励100"+"本月工资为:"+(160*this.wage+(this.hour-160)*(1.5*wage)+100));
            }else {
                System.out.println(this.getName()+"本月工作时长大于160小时,本月工资为:"+(160*this.wage+(this.hour-160)*(1.5*wage)));
            }
        }else {
            System.out.println(this.getName()+"本月工资为:"+this.hour*wage);
        }
    }

    public double getWage() {
        return wage;
    }

    public void setWage(double wage) {
        this.wage = wage;
    }

    public double getHour() {
        return hour;
    }

    public void setHour(double hour) {
        this.hour = hour;
    }
}

        4.父类为 Employee的子类SalesEmployee

        SalesEmployee:
            Employee的子类,销售人员,工资由月销售额和提成率决定。
            属性:月销售额、提成率

创建SalesEmployee

/**
 *
 * 销售人员,工资由月销售额和提成率决定
 */
public class SalesEmployee extends Employee{
    private double monthlysales;//月销售额
    private double commissionrate;//提成率
    @Override
    public void getSalary(int month) {
        if(this.getMonth()==month){
            System.out.println(this.getName()+"本月生日,奖励100"+"本月工资为:"+(monthlysales*commissionrate+100));
        }else {
            System.out.println(this.getName()+"本月工资为:"+(monthlysales*commissionrate));
        }
    }

    public double getMonthlysales() {
        return monthlysales;
    }

    public void setMonthlysales(double monthlysales) {
        this.monthlysales = monthlysales;
    }

    public double getCommissionrate() {
        return commissionrate;
    }

    public void setCommissionrate(double commissionrate) {
        this.commissionrate = commissionrate;
    }
}

        5.父类为SalesEmployee的子类BasePlusSalesEmployee

        BasePlusSalesEmployee:
            SalesEmployee的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。
            属性:底薪。

创建BasePlusSalesEmployee

/**
 *
 * 有固定底薪的销售人员,工资由底薪加上销售提成部分
 */
public class BasePlusSalesEmployee extends SalesEmployee {
    private double basicsalary;//底薪

    @Override
    public void getSalary(int month) {
        if(this.getMonth()==month){
            System.out.println(this.getName()+"本月生日,奖励100"+"本月工资为:"+(basicsalary+getMonthlysales()*getCommissionrate()+100));
        }else {
            System.out.println(this.getName()+"本月工资为:"+(basicsalary+getMonthlysales()*getCommissionrate()));
        }
    }

    public double getBasicsalary() {
        return basicsalary;
    }

    public void setBasicsalary(double basicsalary) {
        this.basicsalary = basicsalary;
    }
}

        6.创建测试类 

        首先创建四种员工然后将四种类型的员工放在一个Employee数组里

        通过for循环遍历,在控制台输入月份来计算当前月份四种员工的工资

/**
 * 测试类
 *      测试四种员工在某月的工资
 * 
 */
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        /**
         * 拿固定工资的员工
         * 月薪结算工资的员工
         */
        SalariedEmployee se1 = new SalariedEmployee();
        se1.setName("张三");
        //员工的出生月份
        se1.setMonth(7);
        //给员工设置月薪
        se1.setMonthlySalary(5000);


        /**
         * 小时结算的工资
         *  每月工作超出160小时的部分按照1.5倍工资发放
         */
        HourlyEmployee he1 = new HourlyEmployee();
        he1.setName("李四");
        //员工的出生月份
        he1.setMonth(10);
        //给员工设置每小时的工资
        he1.setWage(12);
        ///给员工设置每月工作的小时数
        he1.setHour(240);

        /**
         *
         * 销售人员,工资由月销售额和提成率决定
         */
        SalesEmployee se2 = new SalesEmployee();
        se2.setName("王五");
        //员工的出生月份
        se2.setMonth(12);
        //给员工设置月销售额
        se2.setMonthlysales(1000000);
        ///给员工设置提成率
        se2.setCommissionrate(0.2);

        /**
         *
         * 有固定底薪的销售人员,工资由底薪加上销售提成部分
         */
        BasePlusSalesEmployee be1 = new BasePlusSalesEmployee();
        be1.setName("赵六");
        //员工的出生月份
        be1.setMonth(7);
        //给员工设置月销售额
        be1.setMonthlysales(1000000);
        //给员工设置提成率
        be1.setCommissionrate(0.2);
        //设置底薪
        be1.setBasicsalary(3000);

        //将四种员工放入Employee数组中
        Employee[] employee = new Employee[]{se1,he1,se2,be1};
        System.out.println("请输入月份:");
        int month = new Scanner(System.in).nextInt();
        for (int i = 0; i < employee.length; i++) {
            //输入月份计算输入月份四位员工的工资
            employee[i].getSalary(month);
        }
    }
}

运行效果:

  • 没有员工生日

请输入月份:
9
张三本月工资为:5000.0
李四本月工作时长大于160小时,本月工资为:3360.0
王五本月工资为:200000.0
赵六本月工资为:203000.0

Process finished with exit code 0

  • 当李四生日时 

请输入月份:
10
张三本月工资为:5000.0
李四本月工作时长大于160小时且本月生日,奖励100本月工资为:3460.0
王五本月工资为:200000.0
赵六本月工资为:203000.0

Process finished with exit code 0


二、 形状类(接口)Shape求周长和求面积

形状类(接口)的子类(实现类):

Shape接口

public interface Shape {
    //求周长
    public double C();
    //求面积
    public double S();
}


    Rect(矩形)

/**
 * 矩形类
 */
public class Rect implements Shape{
    private double longg;//长
    private double width;//宽

    /**
     * 矩形周长
     * @return
     */
    @Override
    public double C() {
        return (longg+width)*2;
    }

    /**
     * 矩形面积
     * @return
     */
    @Override
    public double S() {
        return longg*width;
    }

    public Rect() {
    }

    public Rect(double longg, double width) {
        this.longg = longg;
        this.width = width;
    }

    public double getLongg() {
        return longg;
    }

    public void setLongg(double longg) {
        this.longg = longg;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }
}


    Circle(圆形)

public class Circle implements Shape{
    private double r;//半径
    private double PI=3.14;
    /**
     * 圆形周长
     */

    @Override
    public double C() {
        return (2*PI*r);
    }

    /**
     * 圆形面积
     * @return
     */
    @Override
    public double S() {
        return PI*Math.pow(r,2);
    }


    public double getR() {
        return r;
    }

    public void setR(double r) {
        this.r = r;
    }

    public Circle() {
    }

    public Circle(double r) {
        this.r = r;
    }
}

Rect类的子类:
    Square(正方形)

public class Square extends Rect{
    @Override
    public double S() {
        return super.S();
    }

    @Override
    public double C() {
        return super.C();
    }
}

测试类

        不同的子类会有不同的计算周长和面积的方法

        创建三个不同的形状对象,放在Shape类型的数组里,分别打印出每个对象的周长和面积

public class Test {
    public static void main(String[] args) {
        //正方形
        Square s1 = new Square();
        s1.setLongg(5);
        s1.setWidth(5);
        //矩形
        Rect rect = new Rect();
        rect.setLongg(7);
        rect.setWidth(3);
        //圆形
        Circle circle = new Circle();
        circle.setR(5);
        //创建Shape数组将创建的对象放入其中
        Shape[] shape = new Shape[]{s1,rect,circle};
        for (int i = 0; i < shape.length; i++) {
            System.out.println("周长"+shape[i].C());
            System.out.println("面积"+shape[i].S());
            System.out.println();
        }
    }
}

运行效果: 

周长20.0
面积25.0

周长20.0
面积21.0

周长31.400000000000002
面积78.5


Process finished with exit code 0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java中的继承实现接口是两种不同的机制,但可以同时使用。 继承是一种对象关系,通过扩展已有的类创建一个新的类。子类继承了父类的属性和方法,并且可以重写父类的方法或添加自己的属性和方法。继承可以实现代码重用和继承层次的构建,在面向对象编程中起到了非常重要的作用。 实现接口是一种约束,通过实现接口定义和规范了一组方法。接口中的方法没有具体的实现,需要在实现接口的类中具体实现。一个类可以实现多个接口,从而具备多个不同的行为。接口可以实现多态性和接口的解耦,是面向对象编程中的重要概念之一。 在Java中,一个类可以同时继承一个类并实现多个接口。通过继承类可以继承类的属性和方法,通过实现接口可以获得接口定义的方法。继承实现接口一起使用可以使得一个类既具备了父类的行为,又能根据需要实现多个接口的行为。 例如,我们有一个动物类Animal,它有一些基本的属性和方法,如eat()和sleep()。我们还有一个接口Swim,其中定义了swim()方法。如果我们想创建一个能够游泳的狗类,我们可以让它继承Animal类并实现Swim接口。这样,这个狗类既能够继承Animal类的行为,如eat()和sleep(),又能够具备Swim接口定义的swim()行为。 综上所述,Java中可以同时使用继承实现接口的机制,通过继承类获得类的属性和方法,通过实现接口获得接口定义的方法。这样可以使得一个类同时具备多个不同的行为,实现更加灵活和可扩展的代码设计。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LXY1013

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

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

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

打赏作者

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

抵扣说明:

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

余额充值