java8接口中的默認方法
概述默認方法
java8中可以在接口中定義一個default修飾的方法,例如:
public interface Sized{
int size();
default boolean isEmpty(){
return size() == 0;
}
}
這樣任何一個實現了Sized接口的類都會自動繼承isEmpty的實現
java 8中的抽象類和抽象接口
一個類智能繼承一個抽象類,但是一個類可以實現多個接口
一個抽象類可以通過實例變量保存一個通用狀態,而接口是不能有實例變量的
默認方法的使用模式
可選方法
很有可能有一種情況就是,類實現了接口,不過卻刻意地將一些方法的實現留白.例如Iterator接口定義了hasNext.next,還定義了remove方法.java8之前,由於用戶通常不會使用該方法,remove方法常被忽略.因此,實現Interator接口的類通常會為remove方法方之一個空的實現
在java8中,Iterator接口就為remove方法提供了一個默認實現,如下所示:
interface Iterator<T>{
boolean hasNext();
T next();
default void remove(){
throw new UnsupportedOerationException();
}
}
行為的多繼承
這是一種讓類從多個來源重用代碼的能力
interface Rotatable{
void setRotationAngel(int angleInDegrees);
int getRotationAngle();
default void rotateBy(int angleInDegrees) {
setRotationAngel((getRotationAngle() + angleInDegrees) % 360);
}
}
interface Resizable {
int getWidth();
int getHeight();
void setWidth(int width);
void setHeight(int height);
void setAbsoluteSize(int width, int height);
default void setRelativeSize(int wFactor, int hFactor) {
setAbsoluteSize(getWidth() / wFactor, getHeight() / hFactor);
}
}
interface Moveable {
int getX();
int getY();
void setX(int x);
void setY(int y);
default void moveHorizontally(int distance) {
setX(getX() + distance);
}
default void moveVertically(int distance) {
setY(getY() + distance);
}
}
class Monster implements Rotatable, Moveable, Resizable {
.....
}
public static void main(String[] args) {
//現在可以直接調用不同的方法:
Monster m = new Monster();
m.rotateBy(180);
m.moveHorizontally(10);
}
解決沖突的原則
interface A{
default void hello() {
System.out.println("from A");
}
}
interface B extends A{
default void hello() {
System.out.println("from B");
}
}
class C implements B, A {
public static void main(String[] args) {
new C().hello();//打印B
}
}
三條原則:
1.類中的方法優先級最高
2.如果無法一句第一條進行判斷,那么子接口的優先級更高:函數簽名相同時,優先選擇擁有最具體實現的默認方法的接口,即如果B繼承了A,那么B就比A更加具體
3.最后,如果還是無法判斷,繼承了多個接口的類必須通過顯示覆蓋和調用期望的方法,顯示地選擇使用哪一個默認方法的實現