天天看點

Java中對于Interface的總結與了解

轉自:http://www.blogjava.net/JafeLee/archive/2007/07/20/119852.html  Author:Jafe Lee

1、一個Interface的方所有法通路權限(visibility)自動被聲明為public,确卻的說,一個Interface的所有方法隻能是public的,你可以顯式聲明一個方法是public(不推薦),但是不能聲明它是private或protected.但是當一個類實作某個接口,定義接口的方法時,必須且隻能聲明為public,否則編譯将通不過。

2、接口不能實作方法(implement method),隻能聲明。接口可以隻定義常量但不聲明任何方法。

3、Interface不能有執行個體域(instance fields)或靜态方法(static method),但可以定義常量(define constants),常量自動設為public static final,可以通過類命直接引用常量,例如

ImplementClass.z

可以通過接口命和常量名直接通路常量:

FirstInterface.z

4、一個非抽象類(注意是非抽象類!)實作一個接口時,必須實作接口的所有方法,抽象類則不必實作所有方法。

5、不能使用new操作符執行個體化一個接口,但可以聲明一個接口變量,該變量必須引用(refer to)一個實作該接口的類的對象。可以使用 instanceof 檢查一個對象是否實作了某個特定的接口。例如:

if (anObject  instanceof  Comparable){

Java中對于Interface的總結與了解

}

6、接口可以被另一個接口繼承(但是final好像不能修飾interface,編譯通不過,以後慢慢研究~~)

7、标記接口(tagging interface, marker interface)沒有方法,使用它的唯一目的是可以用instanceof 進行類型檢查(Horstmann說了,不鼓勵用這種技術,^_^)

8、方法的名字和參數清單被稱為方法的簽名(signature),實作一個接口以為着要用完全相同的簽名實作每個方法。是以實作接口方法時,一定要保證傳回類型的相容性。允許實作類的實作方法傳回類型定義為原傳回類型的子類型。這個跟繼承中子類覆寫父類方法很相似。

8、例子:

Java中對于Interface的總結與了解

interface FirstInterface

{

    int x = 20;   //int x; 是不允許的

    public int y = 21;   //private int y=21; 或protected int y=22;均為非法聲明

    static int z = 22;

    public static int u = 23;  

    void foobar();

}

Java中對于Interface的總結與了解

1  

4 interface SecondInterface extends FirstInterface

5 {

6     int squad(int x);

7 }

Java中對于Interface的總結與了解

 5 class ImplementClass implements SecondInterface

 6 {

 7     public void foobar()

 8     {

 9         System.out.println("I love you!");

10     }

11     

12     public int squad(int x)

13     {

14         return x*x;

15     }

16 }

Java中對于Interface的總結與了解

1 public class Main

 2 {

 3     public static void main(String [] args)

 4     {

 5         FirstInterface ic;

 6         ic  = new ImplementClass(); //指向一個實作該接口的類

 7         SecondInterface sic = new ImplementClass();

 8         System.out.println(ic.x);

 9         System.out.println(sic.y);

10         System.out.println(ImplementClass.z);

11         ic.foobar();

12         sic.foobar();

13     }

14 }

運作結果:

20

21

22

I love you!

I love you!

9、匿名内部類(anonymous inner class):

注意一個特别的例子:

Java中對于Interface的總結與了解

import java.util.Comparator;

public class AnonymousInnerClass

{

    public static void main(String [] args)

    {

         Comparator<String> sizeOrder = new Comparator<String>() 

         {

             public int compare(String s1, String s2) 

             {

                 return s1.length() < s2.length() ? -1 : s1.length() > s2.length() ? 1 : s1.compareTo(s2);

             }

         }; 

         System.out.println(sizeOrder.compare("Jafe", "Lee"));

    }

}

而java.util.Comparator的定義為:

Java中對于Interface的總結與了解

package java.util;

public interface Comparator<T> {

    int compare(T o1, T o2);

    boolean equals(Object obj);

}

我剛開始看覺得奇怪,好像在匿名内部類中沒有實作方法boolean equals(Object obj);後來仔細一想,其實所有的類都是Object的子類,而Object正好有該方法的實作,是以,即使沒有實作該方法也是合法的。