接口是一種引用數據類型,最重要的內容就是其中的 抽象方法。
定義一個接口格式(普通);
public interface 接口名稱 {
//接口的內容
}
接口名稱 每個單詞首字母都用英文大寫(大駝峰格式),和類名稱是一樣的。
附加:
如果的Java7, 那么接口中內容包含了
1.常量 2.抽象方法
Java8,
3.默認方法 4.靜態方法
Java9,
5.私有方法
接口的抽象方法定義。
創建一個接口類(父類);
1 public interface MyInterfaceAbstract { 2 3 4 5 public abstract void methodAbs1(); 6 public abstract void methodAbs2(); 7 public abstract void methodAbs3(); 8 public abstract void methodAbs4(); 9 //抽象方法 10 //抽象方法里的public absstract這2個關鍵字可以不寫,但在初學階段不要不寫,以免發生混淆。 11 12 }
接口的抽象方法使用:
接口使用步驟;
1,接口不能直接使用,必須有一個“實現類”來“實現”該接口。
格式:
public class 實現類名稱 implements 接口名稱{
//。。。。
}
2,接口實現類必須覆蓋重寫 (實現)接口中所有的抽象方法。
實現:去掉abstract關鍵字,加上方法體大括號。
3,創建實現類的對象,進行使用。
創建一個實現類(子類);
在實現類名稱后面加上 impl ,方便查看知道 是某某的實現類。
1 public class MyInterfaceAbseractImpl implements MyInterfaceAbstract { 2 @Override 3 public void methodAbs1() { 4 System.out.println("這是第一個方法" ); 8 } 9 10 @Override 11 public void methodAbs2() { 12 System.out.println("這是第二個方法" ); 14 } 15 16 @Override 17 public void methodAbs3() { 18 System.out.println("這是第三個方法" ); 19 20 } 21 22 @Override 23 public void methodAbs4() { 24 System.out.println("這是第四個方法" ); 25 26 } 27 }
類:
1 public class Demo01Interface { 2 public static void main(String[] args) { 3 //錯誤寫法! 不能直接new接口對象。 4 // MyInterfaceAbstract inter = new MyInterfaceAbstract(); 5 6 //創建實現類的對象使用 7 MyInterfaceAbseractImpl Impl = new MyInterfaceAbseractImpl(); 8 Impl.methodAbs1(); 9 Impl.methodAbs2(); 10 Impl.methodAbs3(); 11 Impl.methodAbs4(); 12 } 13 } 14
注意事項:
1,如果 實現類並沒有覆蓋重寫接口中所以抽象方法,那么 這個實現類自己就必須是抽象類。、
2,此時 不能new接口對象(父類名稱),要new實現類(子類)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
接口的默認方法定義
default(關鍵詞)
1,接口默認方法,可以通過接口實現類對象,直接調用。
2,接口的默認方法,也可以被接口實現類進行覆蓋重寫。
從Java8開始,接口允許定義默認方法。
格式;
public default 返回值類型 方法名稱 (參數列表){
方法體
}
接口 父類:
1 public interface MyInterfaceAbstract { 2 3 4 5 public abstract void methodAbs1(); 6 public abstract void methodAbs2(); 7 public abstract void methodAbs3(); 8 public abstract void methodAbs4(); 9 10 //新添加的方法。改成默認方法 11 public default void methodAbs5(){ 12 System.out.println("這是新添加的默認方法"); 13 } 14 15 16 17 }
實現類;
1 public class MyInterfaceDefaultImpl implements MyInterfaceDefault { 2 3 @Override 4 public void methodAbs1() { 5 System.out.println("實現類抽象方法,AAA"); 6 } 7 8 9 }
類:
1 public class Demo02Interface { 2 public static void main(String[] args) { 3 4 5 //創建了實現類對象 6 MyInterfaceDefaultImpl az = new MyInterfaceDefaultImpl(); 7 az.methodABS();//調用抽象方法,實際運行的是右側實現類。 8
//調用默認方法。如果實現類當中沒有的話,會向上找接口。 9 az.methodABS5(); 10 11 } 12 }
默認方法有個特殊用法;
接口類(父類)定義好了默認方法,但現實類(子類)沒有定義, 類也可以正常打印調用的,
即使實現類(子類)沒有覆蓋重寫接口類(父類) ,但Java編譯器會往上找的。
還有一點需要補充;
如果接口類(父類)和實現類(子類)都有相同名字的默認方法的話,優先用實現類(子類)的。
在創建一個實現類,然后在普通類輸出:new上實現類名稱, 實現類名稱 . (父類方法名稱)();
就能打印出父類的方法體了。
++++++++++++++++++++++++++++++++++++++
接口的靜態方法定義 和使用
從java8開始, 接口當中允許定義靜態方法。
格式;
public static 返回值類型 方法名稱 (參數列表) {
方法體
}
注意事項:就是將abstract或者default換成static即可,帶上方法體。
正確用法:通過接口名稱,直接調用其中的靜態方法。
格式;
接口類(父類):
1 public interface MyInterfaceStatic { 2 3 public static void methodStatic(){ 4 System.out.println("這是接口的靜態方法!"); 5 6 } 7 8 }
實現類(子類):{在這種情況下 可以不用創建實現類,直接調用就可以了}
1 public class MyInterfaceStaticImpl implements MyInterfaceStatic{ 2 3 } 4 5
類(輸出類);
1 public class DemoInterface { 2 3 public static void main(String[] args) { 4 5 //創建了實現類對象, 6 //如果在調用父類的靜態方法的話 就是不用創建實現類對象了 7 MyInterfaceStaticImpl impl= new MyInterfaceStaticImpl(); 8 9 //錯誤寫法! 10 // impl.methodStatic(); 11 12 //直接通過接口名稱調用靜態方法
(父類名稱 . 方法名稱();) 13 MyInterfaceStatic.methodStatic(); 14 15 } 16 }
注意::靜態 對類(子類)有關系 ,既然這樣 那就不用多余的 new創建類型類了(父類)
直接通過類名稱 調用靜態方法就可以了
++++++++++++++++++++++++++++++++++++++++++++
接口私有方法定義和使用。
假設:如果是有兩個方法體之間有重復類容太多了,就需要抽取一把。
問題描述;
1,我們需要抽取一個共有方法,用來解決兩個默認方法之間重復代碼的問題。
2,但是z這個共有方法不應該讓實現類使用,應該是私有化的。
解決方案:
從Java8 開始,接口當中允許定義私有方法。
1.普通私有方法:解決多個默認方法之間重復代碼問題。
格式;
private 返回值類型 方法名稱(參數列表){
方法體
}
例子:
接口;
1 public interface MyInterfaceDefault { 2 3 4 public default void method1() { 5 System.out.println("這是默認方法aaa"); 6 Common(); 7 8 9 } 10 public default void method2() { 11 System.out.println("這是默認方法bbb"); 12 Common(); 13 14 } 15 16 private void Common(){ 17 System.out.println("AAA"); 18 System.out.println("BBB"); 19 System.out.println("CCC"); 20 } 21 22 23 24 }
類;
1 public class Demo02Interface { 2 public static void main(String[] args) { 3 4 MyInterfaceDefaultImpl a = new MyInterfaceDefaultImpl(); 5 a. method1(); 6 a. method2(); 7 }
2.靜態私有方法:解決多個靜態方法之間重復代碼問題。
格式;
private static 返回值類型 方法名稱(參數列表){
方法體
}
例子;
接口類;
1 public interface MyInterfaceDefault { 2 3 4 public static void method1() { 5 System.out.println("這是靜態方法aaa"); 6 Common(); 7 8 9 } 10 11 public static void method2() { 12 System.out.println("這是靜態方法bbb"); 13 Common(); 14 15 } 16 17 private static void Common() { 18 System.out.println("AAA"); 19 System.out.println("BBB"); 20 System.out.println("CCC"); 21 } 22 23 24 }
類;
1 public class Demo02Interface { 2 public static void main(String[] args) { 3 4 MyInterfaceDefault.method1(); 5 MyInterfaceDefault.method2(); 6 } 7 }
效果圖;
注意事項;私有方法在接口創建后,實現類和類是無法進行其他操作的,它只能在接口特給默認方法和靜態方法使用的。
接口的常量定義和使用。
接口當中也可以定義“成員變量”,但是必須使用public static final三個關鍵字進行修飾。
從效果上看,這其實就是接口的【常量】。
格式;
public static final 數據類型 常量名稱 = 數據值;
備注;
一旦使用final關鍵字進行修飾,說明不可改變。
注意事項;
1,接口當中的常量,可以省略public static final,但注意,不寫它也照樣是這樣。
2,接口當中的常量。必須進行賦值,不能不賦值。
3,接口中常量的名稱,使用完全大寫字母,用下划線進行分割。(推薦命名規則)。
(灰色的字體,可以不寫,但效果照樣可以實現的)考慮到初學,建議 還是寫上,便於理解。
例子;
1 public interface MyIntfaceconst { 2 3 public static final int NUM_OF_MY_CLASS = 10; 4 }
1 public class Scout { 2 public static void main(String[] args) { 3 4 System.out.println(MyIntfaceconst.NUM_OF_MY_CLASS); 5 } 6 }