3、final變量(常量)
用final修飾的成員變量表示常量,值一旦給定就無法改變!
final修飾的變量有三種:靜態變量、實例變量和局部變量,分別表示三種類型的常量。
從下面的例子中可以看出,一旦給final變量初值後,值就不能再改變了。
另外,final變量定義的時候,可以先聲明,而不給初值,這中變量也稱為final空白,無論什麼情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關鍵字final的使用上提供了更大的靈活性,為此,一個類中的final數據成員就可以實現依對象而有所不同,卻有保持其恆定不變的特徵。
4、final參數
當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。
生成Java幫助文檔:命令格式:javadoc –d 文件夾名 –auther –version *.java
/** //格式
*類描述
*@author 作者名
*@version 版本號
*/
/**
*方法描述
*@param 參數描述
*@return 返回值描述
*/
繼 承(面向對象特徵之一)
java中對於繼承,java只支持單繼承。java雖然不直接支持多繼承,但是可實現多接口。
1:成員變量。
當子父類中出現一樣的屬性時,子類類型的對象,調用該屬性,值是子類的屬性值。
如果想要調用父類中的屬性值,需要使用一個關鍵字:super
This:代表是本類類型的對象引用。
Super:代表是子類所屬的父類中的內存空間引用。
注意:子父類中通常是不會出現同名成員變量的,因為父類中只要定義了,子類就不用在定義了,直接繼承過來用就可以了。
2:成員函數。
當子父類中出現了一模一樣的方法時,建立子類對象會運行子類中的方法。好像父類中的方法被覆蓋掉一樣。所以這種情況,是函數的另一個特性:重寫
3:構造函數。
發現子類構造函數運行時,先運行了父類的構造函數。為什麼呢?
原因:子類的所有構造函數中的第一行,其實都有一條隱身的語句super();
super(): 表示父類的構造函數,並會調用於參數相對應的父類中的構造函數。而super():是在調用父類中空參數的構造函數。
為什麼子類對象初始化時,都需要調用父類中的函數?(為什麼要在子類構造函數的第一行加入這個super()?)
因為子類繼承父類,會繼承到父類中的數據,所以必須要看父類是如何對自己的數據進行初始化的。所以子類在進行對象初始化時,先調用父類的構造函數,這就是子類的實例化過程。
注意:子類中所有的構造函數都會默認訪問父類中的空參數的構造函數,因為每一個子類構造內第一行都有默認的語句super();
如果父類中沒有空參數的構造函數,那麼子類的構造函數內,必須通過super語句指定要訪問的父類中的構造函數。
如果子類構造函數中用this來指定調用子類自己的構造函數,那麼被調用的構造函數也一樣會訪問父類中的構造函數。
問題:
super()和this()是否可以同時出現的構造函數中?
兩個語句只能有一個定義在第一行,所以只能出現其中一個。
super()或者this():為什麼一定要定義在第一行?
因為super()或者this()都是調用構造函數,構造函數用於初始化,所以初始化的動作要先完成。
在方法覆蓋時,注意兩點:
1:子類覆蓋父類時,必須要保證,子類方法的權限必須大於等於父類方法權限可以實現繼承。否則,編譯失敗。(舉個例子,在父類中是public的方法,如果子類中將其降低訪問權限為private,那麼子類中重寫以後的方法對於外部對象就不可訪問了,這個就破壞了繼承的含義)
2:覆蓋時,要麼都靜態,要麼都不靜態。(靜態只能覆蓋靜態,或者被靜態覆蓋)
繼承的一個弊端:打破了封裝性。對於一些類,或者類中功能,是需要被繼承,或者複寫的。
這時如何解決問題呢?介紹一個關鍵字,final。
final特點:(詳細解釋見前面)
1:這個關鍵字是一個修飾符,可以修飾類,方法,變量。
2:被final修飾的類是一個最終類,不可以被繼承。
3:被final修飾的方法是一個最終方法,不可以被覆蓋。
4:被final修飾的變量是一個常量,只能賦值一次。
抽象類: abstract
抽象類的特點:
1:抽象方法只能定義在抽象類中,抽象類和抽象方法必須由abstract關鍵字修飾(可以描述類和方法,不可以描述變量)。
2:抽象方法只定義方法聲明,並不定義方法實現。
3:抽象類不可以被創建對象(實例化)。
4:只有通過子類繼承抽象類並覆蓋了抽象類中的所有抽象方法後,該子類才可以實例化。否則,該子類還是一個抽象類。
抽象類的細節:
1:抽象類中是否有構造函數?有,用於給子類對象進行初始化。
2:抽象類中是否可以定義非抽象方法?
可以。其實,抽象類和一般類沒有太大的區別,都是在描述事物,只不過抽象類在描述事物時,有些功能不具體。所以抽象類和一般類在定義上,都是需要定義屬性和行為的。只不過,比一般類多了一個抽象函數。而且比一般類少了一個創建對象的部分。
3:抽象關鍵字abstract和哪些不可以共存?final , private , static
4:抽象類中可不可以不定義抽象方法?可以。抽象方法目的僅僅為了不讓該類創建對象。
接 口:★★★★★
1:是用關鍵字interface定義的。
2:接口中包含的成員,最常見的有全局常量、抽象方法。
注意:接口中的成員都有固定的修飾符。
成員變量:public static final
成員方法:public abstract
interface Inter{
public static final int x = 3;
public abstract void show();
}
3:接口中有抽象方法,說明接口不可以實例化。接口的子類必須實現了接口中所有的抽象方法後,該子類才可以實例化。否則,該子類還是一個抽象類。
4:類與類之間存在著繼承關係,類與接口中間存在的是實現關係。
繼承用extends ;實現用implements ;
5:接口和類不一樣的地方,就是,接口可以被多實現,這就是多繼承改良後的結果。java將多繼承機制通過多現實來體現。
6:一個類在繼承另一個類的同時,還可以實現多個接口。所以接口的出現避免了單繼承的侷限性。還可以將類進行功能的擴展。
7:其實java中是有多繼承的。接口與接口之間存在著繼承關係,接口可以多繼承接口 。
java類是單繼承的。classB Extends classA
java接口可以多繼承。Interface3 Extends Interface0, Interface1, interface……
不允許類多重繼承的主要原因是,如果A同時繼承B和C,而b和c同時有一個D方法,A如何決定該繼承那一個呢?
但接口不存在這樣的問題,接口全都是抽象方法繼承誰都無所謂,所以接口可以繼承多個接口。
抽象類與接口:
抽象類:一般用於描述一個體系單元,將一組共性內容進行抽取,特點:可以在類中定義抽象內容讓子類實現,可以定義非抽象內容讓子類直接使用。它裡面定義的都是一些體系中的基本內容。
接口:一般用於定義對象的擴展功能,是在繼承之外還需這個對象具備的一些功能。
抽象類和接口的共性:都是不斷向上抽取的結果。
抽象類和接口的區別:
1:抽象類只能被繼承,而且只能單繼承。
接口需要被實現,而且可以多實現。
2:抽象類中可以定義非抽象方法,子類可以直接繼承使用。
接口中都是抽象方法,需要子類去實現。
3:抽象類使用的是 is a 關係。
接口使用的 like a 關係。
4:抽象類的成員修飾符可以自定義。
接口中的成員修飾符是固定的。全都是public的。
多 態★★★★★
閱讀更多 米蘭老師 的文章