當年面試的時候就被問過這個問題,今天在論壇上看到這個文章總結,順手就轉過來了。
原帖位址:http://topic.csdn.net/u/20100312/10/822B0E94-8D2F-4BF0-9746-3424EAEA40CE.html
1.接口(interface),接口被用來建立類與類之間關聯的标準。
- Java code
-
public interface ITest{ public void test(); } public class TestImpl implements ITest{ public void test(){ System.out.println( " test " ); } }
2.抽象類(abstract class),隻要類中有一個抽象方法,此類就被标記為抽象類。實際上抽象類除了被繼承之外沒有任何意義。
差別
1.
接口是公開(public)的,裡面不能有私有的方法或變量,是用于讓别人使用的,實作接口的一定要實作接口裡定義的所有方法。
而抽象類是可以有私有方法或私有變量的,實作抽象類可以有選擇地重寫需要用到的方法,但是必須實作裡面所有的抽象方法。
2.
抽象類在 Java 語言中表示的是一種繼承關系,一個類隻能使用一次繼承關系。
但是,一個類卻可以實作多個interface(java中實作多重繼承的方法之一)。
3.
抽象類中可以有自己的資料成員,也可以有非abstarct的成員方法。
而在接口中,隻能夠有靜态的不能被修改的資料成員(也就是必須是 static final的,不過在 interface中一般不定義資料成員),而且所有的成員方法都是抽象的。
4.
抽象類和接口所反映出的設計理念不同。
其實abstract class表示的是"is-a"關系,interface表示的是"like-a"關系。(組合是"has a"關系)
5.
接口中定義的變量預設是public static final 型,且必須給其初值,是以實作類中不能重新定義,也不能改變其值。
抽象類中的變量預設是 friendly 型,其值可以在子類中重新定義,也可以重新指派。
一般的應用裡,最頂級的是接口,然後是抽象類實作接口,最後才到具體類實作。不是很建議具體類直接實作接口的。還有一種設計模式是面向接口程式設計,而非面向實作程式設計。
其實接口是抽象類的延伸,可以将它看做是純粹的抽象類,就是說接口比抽象類還抽象,還有設計接口的目的就是為了實作C++中的多重繼承,不過java團隊設計的一樣更有趣的東西來實作這個功能,那就是内部類(inner class)。
内部類(inner class)
- Java code
-
public class OuterClass{ // 外部類 private class InnerClass{} // 内部類 }
一.定義
放在一個類的内部的類我們就叫内部類。
二.作用
1.内部類可以很好的實作隐藏,也就是封裝性。一般的非内部類,是不允許有 private 與protected權限的,但内部類可以
2.内部類擁有外圍類的所有元素的通路權限
3.可是實作多重繼承(這個特點非常重要,個人認為它是内部類存在的最大理由之一)
4.可以避免修改接口而實作同一個類中兩種同名方法的調用
三.多重繼承的實作
類一
- Java code
-
public class Example1 { public String getName() { return " luffyke " ; } }
類二
- Java code
-
public class Example2 { public int getAge() { return 25 ; } }
類三
- Java code
-
public class MainExample { public class Test1 extends Example1 { public String getName() { return super .getName(); } } public class Test2 extends Example2 { public int getAge() { return super .getAge(); } } public String showName() { return new Test1().getName(); } public int showAge() { return new Test2().getAge(); } public static void main(String args[]) { MainExample example = new MainExample(); System.out.println( " 姓名: " + example.showName()); System.out.println( " 年齡: " + example.showAge()); } }
大家注意看類三,裡面分别實作了兩個内部類 Test1,和Test2 ,Test1類又繼承了Example1,Test2繼承了Example2,這樣我們的類三MainExample就擁有了Example1和 Example2的方法和屬性,也就間接地實作了多繼承。
接口是子產品之間的協定,一些子產品用于實作某些協定的具體動作,另外一些子產品隻針對接口程式設計,這樣實作低耦合。
抽象類主要是用于繼承設計的,主要用于模闆設計!