1. 程式人生 > >接口與內部類

接口與內部類

this each 圖片 cin value mouse 因此 ... per

1.什麽是接口(B)

接口是一種引用數據類型,用interface聲明;當出現interface便可判斷為接口。

形式:【修飾符】 interface 接口名稱(public interface Pepar{ })

接口可聲明屬性,且屬性都默認為static final

1 public interface Paper{
2      public static final String value = "0";
3 
4 }

接口也可聲明方法,方法都為公共的抽象方法(以下說的接口方法都為抽象方法);接口只定義方法不實現方法所以不存在方法體。

1 public
interface Color{ 2 public void red(); 3 }

接口不能構造方法,也不能創建對象。

技術分享圖片

一個接口可以繼承多個接口,並且繼承各個接口的定義的方法

1 public interface CInterface extends AInterface, BInterface {
2       //CInterface接口擁有AIterface、BInerface接口定義的方法
3 }

一個類可以實現多個接口,該類稱為實現類;實現一定要實現接口定義的方法。

形式:

 1 public class ImplClassA implements
AInterface,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 }

接口與內部類