接口與內部類
1.什麽是接口(B)
接口是一種引用數據類型,用interface聲明;當出現interface便可判斷為接口。
形式:【修飾符】 interface 接口名稱(public interface Pepar{ })
接口可聲明屬性,且屬性都默認為static final
1 public interface Paper{ 2 public static final String value = "0"; 3 4 }
接口也可聲明方法,方法都為公共的抽象方法(以下說的接口方法都為抽象方法);接口只定義方法不實現方法所以不存在方法體。
1 publicinterface Color{ 2 public void red(); 3 }
接口不能構造方法,也不能創建對象。
一個接口可以繼承多個接口,並且繼承各個接口的定義的方法
1 public interface CInterface extends AInterface, BInterface { 2 //CInterface接口擁有AIterface、BInerface接口定義的方法 3 }
一個類可以實現多個接口,該類稱為實現類;實現一定要實現接口定義的方法。
形式:
1 public class ImplClassA implementsAInterface,BInterface{ 2 3 @Override 4 public void showInfoA() { 5 System.out.println("實現接口中的showInfoA"); 6 } 7 8 @Override 9 public void showInfoB() { 10 System.out.println("實現接口中的showInfoB"); 11 } 12 }
一個類繼承父類的同時,也實現多個接口;形式:先繼承,後實現。
形式:
1 public class ImplClass3 extends AbsClass implements AInterface,BInterface{ 2 3 @Override 4 public void showInfoA() { 5 // TODO Auto-generated method stub 6 7 } 8 9 @Override 10 public void showInfoB() { 11 // TODO Auto-generated method stub 12 13 } 14 15 @Override 16 public void showInfoC() { 17 // TODO Auto-generated method stub 18 19 } 20 21 }
特殊情況:
如果一個抽象父類定義了和接口同名的抽象方法,實現類實現的是抽象父類的抽象方法。
1 package cn.interface02; 2 3 public class ImplClass4 extends AbsClass implements CInterface{ 4 5 @Override 6 public void showInfoA() { 7 // TODO Auto-generated method stub 8 9 } 10 11 @Override 12 public void showInfoB() { 13 // TODO Auto-generated method stub 14 15 } 16 17 @Override 18 public void showInfoC() { 19 // TODO Auto-generated method stub 20 21 } 22 23 }
總結:
其實不難發現接口定義的方法與實現類實現接口定義的方法 ,與父類定義的抽象方法和子類重寫父類抽象方法類似。
2.接口的應用(B)
接口表示一種功能
接口中定義的一些系列方法表示的是一種種的能力。接口讓實現類實現這些能力,實現類的能力得到拓展和升級。
實現類根據自身特性實現接口中定義的方法。
1 package cn.sxt.interface03; 2 3 /** 4 * 駕駛接口 5 */ 6 public interface DriveInterface { 7 /** 8 * 駕駛的方法 9 */ 10 public void drive(); 11 }
package cn.sxt.interface03; public class Student implements DriveInterface{ ////… public void learn(String cName) { System.out.println(this.name+"正在學習"+cName); } @Override public void drive() { System.out.println(this.name+"正在駕駛..."); } }
1 package cn.sxt.interface03; 2 3 public class Teacher implements DriveInterface{ 4 /// … 5 6 @Override 7 public void drive() { 8 System.out.println(this.name+"正在學習駕駛技術..."); 9 System.out.println(this.name+"很快學會了飆車..."); 10 } 11 12 }
接口的多態
一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(方法)(功能)。
1 package cn.sxt.interface4; 2 3 public class Test01 { 4 public static void main(String[] args) { 5 6 // 同一引用類型 7 USBInterface usbInterface = null; 8 9 // 實例不同 10 usbInterface = new USBFan(); 11 // 對同一方法的執行結果不同 12 usbInterface.connect(); 13 14 usbInterface = new USBMouse(); 15 usbInterface.connect(); 16 17 usbInterface = new USBDisk(); 18 usbInterface.connect(); 19 } 20 }
總結:
接口實現多態:接口類型 引用 實現類對象
繼承實現多態: 父類類型 引用 子類對象
接口定義的方法被實現類實現時,是通過引用實現類方法,調用接口方法時,執行的是實現類的方法。
接口:has is
繼承: is a
3.面向接口編程(A)
接口是一種約定(協議),約定實現類具備什麽功能。
接口規範了實現類具備的行為
程序中:面向接口只定義方法沒有方法體,不關心實現類如何實現方法,只關心實現類具不具備接口所定義方法的能力。
1 package cn.sxt.interface06; 2 3 public class Writer { 4 5 // 預留墨盒接口 6 private InkBoxInterface inkBoxInterface; 7 8 // 預留紙張接口 9 private PaperInterface paperInterface; 10 11 public InkBoxInterface getInkBoxInterface() { 12 return inkBoxInterface; 13 } 14 15 public void setInkBoxInterface(InkBoxInterface inkBoxInterface) { 16 this.inkBoxInterface = inkBoxInterface; 17 } 18 19 public PaperInterface getPaperInterface() { 20 return paperInterface; 21 } 22 23 public void setPaperInterface(PaperInterface paperInterface) { 24 this.paperInterface = paperInterface; 25 } 26 27 public Writer(InkBoxInterface inkBoxInterface, PaperInterface paperInterface) { 28 super(); 29 this.inkBoxInterface = inkBoxInterface; 30 this.paperInterface = paperInterface; 31 } 32 33 public Writer() { 34 super(); 35 } 36 37 public void print(String content) { 38 System.out.println("打印機正在使用"+this.inkBoxInterface.getColor()+"顏色打印"+this.paperInterface.getSize()+"打印"+content); 39 } 40 }
抽象類和接口的異同比較 (面試常來題)
- 抽象類和接口都是引用數據類型,他們都不能創建對象。
- 他們都可以定義抽象方法,都可以實現多態。但是抽象類可以定義非抽象方法,而接口中定義的都是抽象方法。
- 抽象類和接口都具有傳遞性。抽象類是單根性(單繼承),而接口是多繼承。
- 在概念上,都可以重寫抽象方法。子類重寫抽象類,實現類實現接口
- 抽象類和子類解決的是模塊內的問題(代碼重用,重寫,多態)而接口解決的是模塊間的問題 => 高內聚,低耦合。接口可以用解耦模塊。
4.object(B)
Object 類是所有類的根類。
如果一個類沒有顯示繼承另外一個類,那麽該類一定繼承於Object。
toString() 返回對象的字符串表示形式
1 public class Test01 { 2 public static void main(String[] args) { 3 Object obj = new Object(); 4 // 輸出對象時,默認調用toString方法 5 System.out.println(obj); 6 // 類型@內存地址 7 System.out.println(obj.toString()); 8 9 10 Student s1 = new Student("二狗",20); 11 System.out.println(s1); 12 } 13 }
可以通過代碼生成器快速生成toString方法。Alt+shift+s->Genrerate toString
equals(Object obj) 用於判斷兩個對象是否相等。
== 比較兩個對象的內存地址或基本數據類型的比較,object默認equals實現比較內存地址。
equals:用於比較兩個對象的內容(屬性)是否相等。
當自定義對象時,要比較自定義對象是否相等,就必須通過equals方法比較兩個對象屬性值是否相等,那就必須重寫Object的equals方法。
1 @Override 2 public boolean equals(Object obj) { 3 if(this == obj) { 4 return true; 5 } 6 7 Student s = (Student) obj; 8 if(this.sid.equals(s.sid) && this.name.equals(s.name) && this.age == s.age) { 9 return true; 10 }else { 11 return false; 12 } 13 }
5.內部類(B)
在java中,一個文件可以定義多個類,文件名必須和public 類型的類的類名保持一致。這兩個類是平行關系。
在java中,一個類也可以定義在一個類的內部,定義在內部的類稱為內部類(inner class),定義在外部的類稱為外部類(out class).
1 public class Outer { 2 [修飾符] class Inner{ 3 } 4 }
編譯後會出現$符outer$inner.class
成員內部
一個內部類作為一個外部類的成員而存在,此時該內部類稱為外部類的成員內部類。
內部類都用默認修飾符
1 public class Outer { 2 class Inner{ 3 } 4 }
【1】內部創建對象
1 public class Test01 { 2 public static void main(String[] args) { 3 4 // 【1】創建外部類對象 5 Outer outer = new Outer(); 6 // 【2】創建內部類對象 7 Inner inner = outer.new Inner(); 8 inner.showInfo(); 9 } 10 }
【2】內部可以訪問外部私有變量
1 public class Outer { 2 3 private String name = "Outer"; 4 5 class Inner{ 6 7 public void showInfo() { 8 System.out.println(name); 9 } 10 11 } 12 }
特殊情況:外部類和內部類的變量同名
1 public class Outer { 2 3 private String name = "Outer"; 4 5 class Inner{ 6 7 private String name = "Inner"; 8 9 public void showInfo() { 10 // String name = "show info"; 11 12 // 訪問外部類的私有成員 13 System.out.println(this.name); 14 15 // 訪問外部類的私有成員 16 System.out.println(Outer.this.name); 17 18 } 19 } 20 }
接口與內部類