/* * 接口 * 引用數據類型: * 類,接口,數組; * * 接口是一種引用數據類型,可以看作是一個特殊的類,它存在的目的是為了解決沒有多重繼承引起的功能弱的問題而設計的,一個類只能有一個父類,但是這個類卻可以實現多個接口; * * 接口還可以看作是只有抽象方法的類,即接口的所有方法都必須被實現; * 接口聲明的關鍵字是interface,代替了class;而普通類的繼承關鍵字extends也變成了implements(實現); * 但是其作用和普通類中是一樣的,只不過是為了區分而已; * * * 1 定義接口的語法: * [修飾符列表] interface 接口名 { } * 2 接口中的內容: * 只能是常量(public static final 常量名)和抽象方法 * 3 抽象方法不需要abstract修飾,默認就是public的(不需要加) * 4 接口可以看作是一個特殊的抽象類,就是完全抽象的,沒有普通的方法 * 5 接口中是沒有構造方法的,也就是接口無法被實例化 * 6 一個類可以實現多個接口,但是只能繼承一個類 * 7 一個非抽象類實現接口,需要將接口中所有的方法都實現(重寫/覆蓋) * 那抽象類實現接口呢? * 抽象類實現接口,可以實現任意個:0~N個 * 8 接口之間: * 可以繼承,不僅如此,接口還可以多繼承,相比來說,類只能單繼承 * * 常量和靜態數據的區別: * 都是在類加載的時候就初始化,但是靜態數據可以進行多次賦值 * * 常量:一般都必須使用public static final修飾,在接口中聲明常量,這些都是可以省略的; * 命名方式:大寫字母加下劃線的形式命名; * * 注意: 上述部分需要區分接口和接口間的"繼承",類和接口間的"實現",類和類的"繼承"; */ public class JavaSE{ public static void main(String[] args){ F f = new F(); f.m1(); f.m2(); f.m3(); f.m4(); } } interface A{//接口A public void m1(); } interface B{//接口B public void m2(); } interface C{//接口C void m3();//接口中方法的public是可以省略的; } interface D extends A,B,C{//接口的多繼承 void m4(); } class MyClass implements B,C{//普通類對接口的實現 public void m2(){ System.out.println( "覆寫B接口的m2()方法" ); } public void m3(){ System.out.println( "覆寫C接口的m3()方法" ); } } abstract class E implements D{//抽象類對接口的實現 public static final int A = 10;//常量的聲明方式 char C = '中'; public void m1(){ } public void m2(){ } public void m3(){ } public void m4(){ } } class F extends E{//需要覆寫E中所有的方法 public void m1(){ System.out.println( "覆寫m1()方法" ); } public void m2(){ System.out.println( "覆寫m2()方法" ); } public void m3(){ System.out.println( "覆寫m3()方法" ); } public void m4(){ System.out.println( "覆寫D中的m4()方法" ); } }