BD-11-day10-抽象类和接口

抽象类:可以有成员变量,有构造函数,但是不能实例化。

接口:接口中的方法一般都是共有抽象方法:public abstract

           接口中所有的属性都是共有静态常量属性:pulbic static final

一个类可以同时继承父类,实现接口,注意:声明类时,必须先继承再实现接口。

接口之间的关系:

 接口之间可以用extends继承,没有私有成员,子接口全继承。

子接口也不需要实现抽象方法,因为它们都是接口。

接口可多继承。

接口特殊方法:在接口中使用static关键字修饰的方法有方法体,​ 静态方法需要有方法体。

有子类共同需要的函数时,不需要重写的函数,又有需要子类实现的功能时,考虑用类的继承和接口结合。

子类不可以继承父类的private 成员。

练习:



package com.judy.demo;


public class HelloWorld {
    public static void main(String[] args) {
        Technology t1 = new Technology(007, "judy", 300, 8);
        double sal = t1.getSal();
        int lever = t1.lever(sal);
        Technology technology = new Technology(007, "judy", 300, 8, sal, lever);
        System.out.println(technology.toString());
        // 上面这个方法我写得好累赘呀,但是我想重写toString(),不知道怎么写,写成了这样。

        Salesman salesman = new Salesman(8, "TOM", 2500.5, 6);
        double sal2 = salesman.getSal();
        salesman.setSalary(sal2);
        int lever2 = salesman.lever(sal2);
        salesman.setSaLever(lever2);
        System.out.println("编号是" + salesman.id + "的员工姓名是" + salesman.name + "工资是" + salesman.getSalary() + "工资级别是" + salesman.getSaLever());
    }
}


class Company {
    public int id;
    public String name;
    public double salary;
    public int saLever;

    //    Company(int id,String name){
//        this.id=id;
//        this.name=name;
//    }  //为什么写父类构造器,子类实现接口就出错呢???
    void setSalary(double salary) {
        this.salary = salary;
    }

    double getSalary() {
        return salary;
    }

    void setSaLever(int saLever) {
        this.saLever = saLever;
    }

    int getSaLever() {
        return saLever;
    }

    public int lever(double sal) {
        if (sal <= 3000) {
            return 1;
        } else if (sal > 3000 && sal <= 5000) {
            return 2;
        } else if (sal > 5000 && sal <= 8000) {
            return 3;
        } else {
            return 4;
        }
    }

}

interface Sal {
    public abstract double getSal();
}

class Technology extends Company implements Sal {
    public double hourlyPay;
    public double hours;

    Technology(int id, String name, double hourlyPay, double hours) {
        this.id = id;
        this.name = name;
        this.hourlyPay = hourlyPay;
        this.hours = hours;
    }

    Technology(int id, String name, double hourlyPay, double hours, double salary, int lever) {
        this.id = id;
        this.name = name;
        this.hourlyPay = hourlyPay;
        this.hours = hours;
        this.salary = salary;
        this.saLever = lever;
    }

    @Override
    public double getSal() {
        return hourlyPay * hours;
    }

//    double sal = getSal();

    @Override
    void setSalary(double salary) {
        super.setSalary(salary);
    }

    @Override
    public String toString() {
        return "编号是" + id + "的员工姓名是" + name + "工资是" + salary + "工资级别是" + saLever;
    }
}

class Salesman extends Company implements Sal {
    public double bonus;
    public double sales;

    Salesman(int id, String name, double bonus, double sales) {
        this.id = id;
        this.name = name;
        this.sales = sales;
        this.bonus = bonus;
    }

    @Override
    public double getSal() {
        return bonus * sales;
    }

    @Override
    void setSalary(double salary) {
        super.setSalary(salary);
    }

}

只写了两个子类。

想重写toString,但是父类的成员变量需要子类计算出来之后才能初始化,这个怎么怎么写呢?

我写得很累赘,而且没有本质上的输出,成员,又new了一个对象,根本不是同一个对象。

猜你喜欢

转载自blog.csdn.net/weixin_42474930/article/details/81287354
今日推荐