1、什么是接口?
類比抽象類,把功能或者特性類似的一類 抽象的更徹底,可以提煉出更加特殊的“抽象類”----接口
2、如何定義接口
語法:
[修飾符] interface 接口名 {
N個常量定義...
N個抽象方法定義...
N個內部類、接口、枚舉定義....
N個私有方法,默認方法或者類方法定義
}
修飾符一般為public 即可以跨包訪問,絕大多數情況接口都是需要跨包訪問的
3、接口特性注意:
-
接口修飾符public可以省略,省略后不能在包外訪問,所以99%+ 實際應用中都是需要public
-
不支持變量定義,定義出來的變量都是常量。也就是說默認都是被隱藏的static、final修飾的類變量。
如下兩行代碼效果一樣
int maxNum = 10; public static final int maxNum = 10;
-
接口中定義的方法,認都是public (公開)、abstract (抽象) 的。必須被類實現,
-
java9接口中還可以定義默認方法。當實現類中沒有重寫方法的話,調用的就是這個默認方法。
- java9接口中還可以使用private的方法。這些private 的方法就是給默認方法充當工具方法的。
示例:圖形接口
package com.zmd.study.interface_example; /** * @ClassName Shape * @projectName: object1 * @author: Zhangmingda * @description: 定義一個形狀接口,用於三角形或其它圖形類實現功能,或者子接口繼承 * date: 2021/3/30. */ public interface Shape { /** * 接口中定義的變量 默認為常量:自動被public static final 修飾 * 如下mxNum變量的定義等於:public static final int maxNum = 10; */ int maxNum = 10; //public static final int maxNum = 10; /** * 獲取平面圖形的類型 */ public abstract String getType(); /** * 獲取平面圖形的周長 */ public abstract double getPerimeter(); }
三角形類實現接口
package com.zmd.study.interface_example; /** * @ClassName Triangle * @projectName: object1 * @author: Zhangmingda * @description: 類實現了接口功能,使用implements關鍵字 * date: 2021/3/30. */ public class Triangle implements Shape { /** * 三角形的三邊長類型定義 */ private double a; private double b; private double c; /** * 構造方法,創建三角形實例必須提供三邊長度 */ public Triangle(double a, double b, double c) { /** *@params [a, b, c] 三角形三邊長度 *@return null *@創建時間 2021/3/30 */ if(a+b < c || a+c < b || b+c < a){ System.out.println("Failed!:三角形的兩邊之和必須大於第三邊"); return; } this.a = a; this.b = b; this.c = c; } @Override public String getType() { if(a+b < c || a+c < b || b+c < a){return "未知圖形";} return "三角形"; } @Override public double getPerimeter() { return a + b + c; } }
測試運行
package com.zmd.study.interface_example; /** * @ClassName InterfaceTest * @projectName: object1 * @author: Zhangmingda * @description: XXX * date: 2021/3/30. */ public class InterfaceTest { public static void main(String[] args) { Shape triangle = new Triangle(3,4,5); System.out.println(triangle.getType()); System.out.println(triangle.getPerimeter()); } } /** 輸出: 三角形 12.0 */
4、接口的默認方法 default 修飾 (java 9新特性)
實現類中沒有重寫方法的話,調用的就是這個默認方法。
如上Shape.java中 增加default修飾的方法
package com.zmd.study.interface_example; /** * @ClassName Shape * @projectName: object1 * @author: Zhangmingda * @description: 定義一個形狀接口,用於三角形或其它圖形類實現功能,或者子接口繼承 * date: 2021/3/30. */ public interface Shape { ...同上省略
/** * 定義一個默認方法;如果實現接口的類沒有寫這個方法,也可以使用 */ default public void printMe(){ System.out.println("我是:" + getType() + "我的周長是:" + getPerimeter()); } }
三角形類同上:Triangle.java
測試類實例化三角形Triangle()調用printMe()方法
public class InterfaceTest { public static void main(String[] args) { Shape triangle = new Triangle(3,4,5); System.out.println(triangle.getType()); System.out.println(triangle.getPerimeter()); triangle.printMe(); } } /** 三角形 12.0 我是:三角形我的周長是:12.0 /*
5、接口中的private的方法(java9新特性)
作用:完全是給default 默認方法充當工具方法,當有多個default方法有共同的代碼的時候,可以單獨列出來。
package com.zmd.study.interface_example; /** * @ClassName Shape * @projectName: object1 * @author: Zhangmingda * @description: 定義一個形狀接口,用於三角形或其它圖形類實現功能,或者子接口繼承 * date: 2021/3/30. */ public interface Shape { ...省略如上代碼... /** * 定義一個默認方法;如果實現接口的類沒有寫這個方法,也可以使用 */ default public void printMe(){ beforPrintMe(); System.out.println("我是:" + getType() + "我的周長是:" + getPerimeter()); } /** * java9 特性:接口可以用private 私有的方法,給default方法充當工具方法 */ private void beforPrintMe(){ System.out.println("beforPrintMe()....干了一些活"); } }
三角形類同上:Triangle.java
測試類實例化三角形Triangle()調用printMe()方法
package com.zmd.study.interface_example; /** * @ClassName InterfaceTest * @projectName: object1 * @author: Zhangmingda * @description: XXX * date: 2021/3/30. */ public class InterfaceTest { public static void main(String[] args) { Shape triangle = new Triangle(3,4,5); System.out.println(triangle.getType()); System.out.println(triangle.getPerimeter()); triangle.printMe(); } } /** 三角形 12.0 beforPrintMe()....干了一些活 我是:三角形我的周長是:12.0 */
6、子接口定義(接口的繼承)
語法:
[修飾符] interface 接口名 extends 父接口,父接口2...{
....同上
}
示例:
動物接口、人接口、女人接口;女人接口繼承動物和人。wife 類實現女人接口。wife類就具有如上接口的default方法
動物接口
package com.zmd.study.interface_example; public interface Animal { default void yell(){ System.out.println("動物 啊....叫喊!!!"); } }
人接口
package com.zmd.study.interface_example; public interface Person { default void makeLove(){ System.out.println("Person makeLove 啊!...哦...啊..."); } }
女人接口
package com.zmd.study.interface_example; public interface Woman extends Animal, Person{ }
wife類
package com.zmd.study.interface_example; public class Wife implements Woman { }
測試類
package com.zmd.study.interface_example; public class InterfaceTest { public static void main(String[] args) { Wife wife = new Wife(); wife.yell(); wife.makeLove(); } } /** 動物 啊....叫喊!!! Person makeLove 啊!...哦...啊... */
7、一個類實現多個接口
用一個學生類實現6中的Animal、Person接口。並增加自己的功能
學生類Student.java
package com.zmd.study.interface_example; public class Student implements Animal,Person { public void study(){ System.out.println("學習"); } }
測試類
package com.zmd.study.interface_example; /** * @ClassName InterfaceTest * @projectName: object1 * @author: Zhangmingda * @description: XXX * date: 2021/3/30. */ public class InterfaceTest { public static void main(String[] args) { Student student = new Student(); student.study(); student.yell(); student.makeLove(); } } /** 學習 動物 啊....叫喊!!! Person makeLove 啊!...哦...啊... */
其他類似案例場景
接口實現業務邏輯課插拔,更換數據庫直接改配置文件即可。