Java學習筆記二

惹不起的程咬金發表於2011-08-18

抽象類:

1.使用abstract修飾的類叫抽象類,抽象類中不一定所有的方法都是抽象的,甚至可以沒有一個抽象方法。如果將一個類宣告為abstract,此類不能生成物件,只能被繼承使用。 

2.如果一個類中包含抽象方法,這個類為抽象類,抽象類不能例項化,但可以申明。如果一個類中有abstract方法,那麼必須在定義類的時候加上abstract修飾。

3.子類繼承抽象類需要實現其抽象方法,如果不實現,那麼改繼承子類仍然為抽象類。即抽象類具有傳遞性,傳遞結束點為實現了抽象方法的子類。

 4.抽象方法只申明返回的資料型別,方法名和引數,沒有方法體。

5 抽象方法不能用final來修飾,一個類不能既是終類又是抽象類。

6抽象類不能被例項化,但不代表它不可以有建構函式,抽象類可以有建構函式,備繼承類擴充


介面:

The interface keyword produces a completely abstract class, one that provides no implementation at all. It allows the creator to determine method names, argument lists, and return types, but no method bodies.


interface is used to establish a "protocol" between classes.


An interface can also contain fields, but these are implicitly static and final


Java 介面允許繼承介面。

Using the same method names in different interfaces that are intended to be combined generally causes confusion in the readability of the code, as well. Strive to avoid it.

 過載(Overload):

規則 :
被過載的方法必須改變引數列表;
被過載的方法可以改變返回型別;
被過載的方法可以改變訪問修飾符;
被過載的方法可以宣告新的或更廣的檢查異常;
方法能夠在同一個類中或者在一個子類中被過載。
重寫(Override) :
引數列表必須完全與被重寫方法的相同;
返回型別必須完全與被重寫方法的返回型別相同;
訪問級別的限制性一定不能比被重寫方法的強;
訪問級別的限制性可以比被重寫方法的弱;
重寫方法一定不能丟擲新的檢查異常或比被重寫的方法宣告的檢查異常更廣泛的檢查異常
不能重寫被標示為final的方法;
如果不能繼承一個方法,則不能重寫這個方法。

Nestinglnterfaces shows the various ways that nested interfaces can be implemented. In particular, notice that when you implement an interface, you are not required to implement any interfaces nested within. Also, private interfaces cannot be implemented outside of their defining classes.


Java巢狀介面:

在Java語言中,介面可以巢狀在類或其它介面中。由於Java中interface內是不可以巢狀class的,所以介面的巢狀就共有兩種方式:class巢狀interface、interface巢狀interface。

1. class巢狀interface
這時介面可以是public,private和package的。重點在private上,被定義為私有的介面只能在介面所在的類被實現。可以被實現為public的類也可以被實現為private的類。當被實現為public時,只能在被自身所在的類內部使用。只能夠實現介面中的方法,在外部不能像正常類那樣上傳為介面型別。

2. interface巢狀interface
由於介面的元素必須是public的,所以被巢狀的介面自動就是public的,而不能定義成private的。在實現這種巢狀時,不必實現被巢狀的介面。


--------------------------------------------------------------------------------------------

抽象類和介面的區別: 轉載

兩者相似之處在於:抽象類和介面都不能被例項化,兩種都是java實現抽象的方式。不同之處分兩個方面:


一、語法層面

  1. 抽象類可以有構造方法,介面中不能有構造方法;
  2. 抽象類中可以有普通成員變數,介面中沒有普通成員變數(預設public static final);
  3. 抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的;
  4. 抽象類中的抽象方法的可以是public,protected的,但介面中的抽象方法只能是public的;
  5. 抽象類中可以包含靜態方法,介面中不能包含靜態方法
  6. 抽象類中可以包含任意訪問許可權的靜態成員變數,但介面中定義的變數只能是public static final型別。
  7. 一個類可以實現多個介面,但只能繼承一個抽象類。

二、思想層面

 

     抽象類在Java中體現了一種繼承關係,要想使得繼承關係合理,抽象類和派生類之間必須存在“is-a”關係,即 

父類和子類在概念本質上應該是相同的。對於interface來說則不然,並不要求 interface的實現類和interface定義在概念本質上是一致的,僅僅是實現了interface定義的契約(模版)而已。



 在interface裡面的變數都是public static final 的。所以你可以這樣寫:

  public static final int i=10;

  或則

  int i=10;(可以省略掉一部分)

  注意在宣告的時候要給變數賦予初值

  解釋:

  首先你要弄清介面的含義.介面就是提供一種統一的’協議’,而介面中的屬性也屬於’協議’中的成員.它們是公共的,靜態的,最終的常量.相當於全域性常量.

  抽象類是不’完全’的類,相當於是介面和具體類的一箇中間層.即滿足介面的抽象,也滿足具體的實現.

  如果介面可以定義變數,但是介面中的方法又都是抽象的,在介面中無法通過行為來修改屬性。有的人會說了,沒有關係,可以通過實現介面的物件的行為來修改介面中的屬性。這當然沒有問題,但是考慮這樣的情況。如果介面A中有一個public訪問許可權的靜態變數a。按照java的語義,我們可以不通過實現介面的物件來訪問變數a,通過A.a = xxx;就可以改變介面中的變數a的值了。正如抽象類中是可以這樣做的,那麼實現介面A的所有物件也都會自動擁有這一改變後的a的值了,也就是說一個地方改變了a,所有這些物件中a的值也都跟著變了。這和抽象類有什麼區別呢,怎麼體現介面更高的抽象級別呢,怎麼體現介面提供的統一的協議呢,那還要介面這種抽象來做什麼呢?所以介面中不能出現變數,如果有變數,就和介面提供的統一的抽象這種思想是牴觸的。所以介面中的屬性必然是常量,只能讀不能改,這樣才能為實現介面的物件提供一個統一的屬性。

  通俗的講,你認為是要變化的東西,就放在你自己的實現中,不能放在介面中去,介面只是對一類事物的屬性和行為更高層次的抽象。對修改關閉,對擴充套件(不同的實現implements)開放,介面是對開閉原則的一種體現

相關文章