接口
继承:is-a,谁是谁;
接口:has a,有一个什么;
为什么要使用接口?
接口:可以被认为是一种规范。
接口:可以被认为是实现了某种功能,这种功能是通过接口来实现的。
接口怎么写?
接口实际上可以被看作是一种受到限制的类,所以我们将class换成了interface。
接口里面可以写4种内容,
- 常量
- 抽象方法
- 静态方法
- 默认方法
修饰符 interface 接口名{
public static final int one = 3.14;//public static final 是默认的可以不写
public abstract void two();//public abstract 是默认的可以不写
public static void three(){//public 是默认的可以不写
}
public default void four(){//public 是默认的可以不写
}
}
接口怎么用?(接口就是特殊受限制的类)
- 接口和类之间:实现(接口继承)
public interface One{
}
public interface Two{
}
public class Three implements One,Two{//类Three实现了接口one和two
}
- 接口和接口之间:继承,并且接口支持多重继承。
public interface One{
}
public interface Two{
}
public interface Three extends One,Two{//接口Three继承了接口one和two
}
- 当一个类又继承,又实现接口时,接口应该写在继承之后;
class One{}
public interface Two{}
public interface Three{}
class Four extends One implements Two,Three{}
接口需要注意的问题:
- 接口和接口间的继承,只继承非static内容,即抽象方法和default方法。
- 类实现接口时,需要重写或覆盖抽象方法,否则这个类应该写为抽象的。
- 接口和抽象类一样,都不能产生对象。
- 接口只能是public。
default static
为什么提供默认方法?
- default 方法是接口中自带实现的方法。大多数都希望用这种实现。
- default方法在实现接口时,是无需重写的,但是也可以进行重写。
- 但是static是不能被重写的;
默认方法冲突
- 父类优先,如果既有接口,也有父类,此时父类和接口中相同的方法只考虑用父类的。
- 当多个接口中都有default方法,那么此时子类谁也不用,必须覆盖(自己重写)。
Comparable
- 这个接口涉及到对象的比较,即比较两个对象的大小。
- 对象在今后涉及到比较的时候,都需要实现这个接口。
public interface Comparable<T>{//比较 接口
public int compareTo(T o);
}
怎么用这个接口?
public class Name implements Comparable<Name>{
public int compareTo(Name o){
//自己写比较规则
//如果当前对象(this)比另一个对象(o)小,就要返回负数。
//等于返回0;
//如果当前对象(this)比另一个对象(o)大,就要返回正数。
}
}
Comparator
特殊情况
- 我们用了一个别人写的类,需要对象比较。
- 没有实现接口。
- 我们又不能修改别人写的类。
解决这个情况的方法是:写一个类,名字任意,但是要求这个类实现Comparator接口。