轉自: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){

}
6、接口可以被另一個接口繼承(但是final好像不能修飾interface,編譯通不過,以後慢慢研究~~)
7、标記接口(tagging interface, marker interface)沒有方法,使用它的唯一目的是可以用instanceof 進行類型檢查(Horstmann說了,不鼓勵用這種技術,^_^)
8、方法的名字和參數清單被稱為方法的簽名(signature),實作一個接口以為着要用完全相同的簽名實作每個方法。是以實作接口方法時,一定要保證傳回類型的相容性。允許實作類的實作方法傳回類型定義為原傳回類型的子類型。這個跟繼承中子類覆寫父類方法很相似。
8、例子:
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();
}
1
4 interface SecondInterface extends FirstInterface
5 {
6 int squad(int x);
7 }
1
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 }
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):
注意一個特别的例子:
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的定義為:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
我剛開始看覺得奇怪,好像在匿名内部類中沒有實作方法boolean equals(Object obj);後來仔細一想,其實所有的類都是Object的子類,而Object正好有該方法的實作,是以,即使沒有實作該方法也是合法的。