java中類和接口的一點整理
1 引言
剛開始接觸java的時候,也是第一次接觸面向對象的思想。對於java中的繼承,多態等概念非常模糊,在實際編程的時候也沒有怎么用到。有了一段時間的項目經歷加上閱讀相關書籍,其他開源框架代碼后的源碼后就稍微有了點認識。這里稍微整理下,有不正確的方法還請大家指正,謝謝。
2 接口
2.1 定義
在說接口之前,先說下抽象方法。抽象方法指得是沒有任何實現的方法,只是一個空的方法體,一般用abstratc修飾詞修飾。如下所示:
abstract void function();
而接口中的方法全部都是抽象方法,如果接口中還有變量定義,那么那么變量默認是final static類型的,接口中還可以含有內部類。
2.2 使用
- 除了接口定義之外地一些瑣碎的整理都放在這個地方了。一直不是很明白sun設計接口的初衷是什么,但是感覺有了接口以后,整個項目的設計就會非常的清晰。接口可以繼承於另外一個接口,可以被其他很多類實現。
- 一個類要實現一個接口,那么必須實現這個接口中的所有方法。這也意味着一個接口如果被很多類實現了,那么這些類中都會對這個接口有不同的實現。這樣就可以在類中把一些事務共有的特性給抽象出來了。比如在《thinking in java》中的一個比較好理解的例子。所有的形狀圓形,矩形,菱形等都有不同的計算周長和面積的方法,那么就可以定義一個形狀接口,里面有周長和面積等抽象方法,讓不同的類來實現。如圖所示:
-
- 接口中的方法默認是用public abstract來修飾的,所以某個接口被實現后,實現的方法也必須由public來修飾。
- 接口的定義特別適合用來體現java中的多態性,因為java中有向上轉型的概念。例如上面的例子中,可以定義一個形狀接口的對象,但是具體可以有不同的類來實例化,如下所示:
Shape circle=new Circle(); Shape square=new Square(); ...
如果一個類實現了非常多的接口,那么它可以向上轉型成任意一個類型。
3 類
類中有些比較特殊的類型,列舉如下
3.1 抽象類
抽象類被abstract關鍵詞修飾,和接口一樣不能被直接實例化。抽象類中可以包含抽象方法,當然也可以不含有任意的抽象方法,這樣可以使得該類不被實例化。而接口可以看做是一種特殊的抽象類,里面的方法全部都是抽象方法。
抽象方法可以看成是接口的部分實現。比如說上面的形狀的例子中,可以定義不規則形繼承於形狀,但是只實現里面的計算周長的方法,不實現里面的計算面積的方法。如下圖所示:
3.2 內部類
內部類按照字面意思就可以知道,存在於一個類的內部。它和普通類的區別不僅是存在的位置不一樣,而且內部類還可以被關鍵詞private和static修飾。 內部類的存在,總結了下它的作用:
- 可以被修飾為private,從而隱藏了其實現細節,不能被外面的對象訪問。
- 內部類可以對其封裝類所有元素擁有訪問權限
- 內部類在GUI中很有用,用於控制框架的應用。 還有別的一些功能暫時還不知道。
內部類按照類型又可以分成好幾類,如:
- 內部匿名類
- static內部類
- 內部類存在於控制塊中
等等,內部類也可以在其他類中被繼承,不過必須明確地指定,如下所示1:
// Proper inheritance of an inner class class Egg2 { protected class Yolk { public Yolk() { System.out.println("Egg2.Yolk()"); } public void f() { System.out.println("Egg2.Yolk.f()"); } } private Yolk y = new Yolk(); public Egg2() { System.out.println("New Egg2()"); } public void insertYolk(Yolk yy) { y = yy; } public void g() { y.f(); } } public class BigEgg2 extends Egg2 { public class Yolk extends Egg2.Yolk { public Yolk() { System.out.println("BigEgg2.Yolk()"); }192 public void f() { System.out.println("BigEgg2.Yolk.f()"); } } public BigEgg2() { insertYolk(new Yolk()); } public static void main(String[] args) { Egg2 e2 = new BigEgg2(); e2.g(); } }