大学里的学生(Student)需要交学费,而研究生(Graduate)作为学生比较特殊,除了需要交学费外,还可以获取一部分科研津贴,由学校(University)统一发放。此外,学校还需要发放教师(Teacher)的工资:
Student:
public abstract class Student {
public String name;
public int fee;
public Student(String name){ //带参的构造方法
this.name=name;
}
abstract void setFee(int fee);//两个抽象方法,继承的子类必须实现
abstract int getFee();
}
Graduate:
public class Graduate extends Student implements Salary{//Graduate继承了Student类
private static final boolean TRUE = true;//并且实现Salary接口类
private static final boolean FLASE = false;
int salary;
Graduate(String name){ //带参的构造方法
super("小红"); //子类必须先调用父类的构造方法,否则会出错
super.name=name;
//super(name);
}
void setFee(int fee){//用于修改研究生学费
super.fee=fee;
}
int getFee(){//得到研究生的学费
return fee;
}
public int getSalary(){ //得到研究生工资
return 1500;
}
boolean isLoan(){ //用于判断研究生是否需要贷款
if(getSalary()<getFee())
return TRUE;
else return FLASE;
}
}
Teacher:
public class Teacher implements Salary{ //实现接口类
String name;
int salary;
Teacher(String name){ //带参的构造方法
this.name=name;
}
public int getSalary(){ //重写接口中的抽象方法,返回的是教师的工资
return 3000;
}
}
Universit:
public class Universit {
void payOff(Salary s){ //大学给研究生和教师发工资的方法
/*if(s instanceof Teacher){
System.out.println((Teacher)s.name+"应支付工资:"+s.getSalary());
}
else if(s instanceof Graduate){
System.out.println((Graduate)s.name+"应支付工资:"+s.getSalary());
}*/
System.out.println("应支付工资:"+s.getSalary());
}
}
Salary:
public interface Salary { //一个接口
int getSalary(); //定义了一个方法,接口中的方法都是抽象方法,需要被重写
}
Test:
public class Test {
public static void main(String[] args) {
Graduate g = new Graduate("小亮");
g.setFee(2000);
Universit u = new Universit();
System.out.print(g.name);
u.payOff(g);
System.out.println("是否需要贷款:"+g.isLoan());
Teacher t = new Teacher("大王");
System.out.print(t.name);
u.payOff(t);
}
}
测试结果: