抽象方法本质上是定义接口规范,从而保证所有子类都有相同的接口实现,从而使多态发挥出威力。Java的接口特指interface
的定义,表示一个接口类型和一组方法签名,而编程接口泛指接口规范,如方法签名,数据格式,网络协议等。
如果一个抽象类没有字段,方法全是抽象方法,就可以将该抽象类改写成接口:interface
例如,抽象类:
abstract class Person {
public abstract void run();
public abstract String getName();
}
改写成接口interface:
interface Person {
void run();
String getName();
}
接口没有字段,接口的定义方法默认都是public abstract,所以这两个修饰符不需要写出来。
当一个class去实现interface时,需要使用implements关键字。
class Student implements Person {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(this.name + " run");
}
@Override
public String getName() {
return this.name;
}
}
一个类可以实现多个interface(不同于一个类只能继承自另一个类)。
一个interface
可以继承自另一个interface
。interface
继承自interface
使用extends
,它相当于扩展了接口的方法。
在接口中,可以定义default
方法。实现类可以不必覆写default
方法。default
方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default
方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。default
方法无法访问实例字段,而抽象类的普通方法可以访问实例字段。
interface
是可以有静态字段的,并且静态字段必须为final
类型.
练习:给一个有工资和稿费的小伙伴算税,工资中超过5000不超过10000的部分税率为0.1,超过10000的部分税率为0.2;稿费的税率是0.2.
public class demo1 {
public static void main(String[] args) {
Income [] incomes=new Income[]{
new Salary(7000),
new Royalty(3000)
};
System.out.println(totaltax(incomes));
}
public static double totaltax(Income []incomes){
double totaltax=0;
for(Income income:incomes){
totaltax+=income.gettax();
}
return totaltax;
}
}
//定义抽象类
interface Income{
double gettax();
}
//工资
class Salary implements Income{
private double income1;
public Salary(double income1){
this.income1=income1;
}
public double gettax(){
if(income1<=5000)
return 0;
else if(income1>5000 && income1<=10000){
return (this.income1-5000)*0.1;
}
else {
return (this.income1-10000)*0.2+5000*0.1;
}
}
}
//稿费
class Royalty implements Income{
private double income2;
public Royalty(double income2){
this.income2=income2;
}
public double gettax(){
return income2*0.2;
}
}