java中類和接口的一點整理


 

 

java中類和接口的一點整理

Table of Contents

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();
  }
} 

Footnotes:

1 :《think in java 第四版》,191-192

Date: 2012-05-09 17:53:43

Author:

Org version 7.8.09 with Emacs version 23

Validate XHTML 1.0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM