抽象類 介面 以及修飾符的總結
1、抽象類中的抽象方法(其前有abstract修飾)不能用private、static、synchronized、native訪問修飾符修飾。原因如下:抽象方法沒有方法體,是用來被繼承的,所以不能用private修飾;static修飾的方法可以通過類名來訪問該方法(即該方法的方法體),抽象方法用static修飾沒有意義;使用synchronized關鍵字是為該方法加一個鎖。。而如果該關鍵字修飾的方法是static方法。則使用的鎖就是class變數的鎖。如果是修飾類方法。則用this變數鎖。但是抽象類不能例項化物件,因為該方法不是在該抽象類中實現的。是在其子類實現的。所以。鎖應該歸其子類所有。所以。抽象方法也就不能用synchronized關鍵字修飾了;native,這個東西本身就和abstract衝突,他們都是方法的宣告,只是一個吧方法實現移交給子類,另一個是移交給本地作業系統。如果同時出現,就相當於即把實現移交給子類,又把實現移交給本地作業系統,那到底誰來實現具體方法呢?
2、介面是一種特殊的抽象類,介面中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象類中的抽象方法不能用的訪問修飾符這裡也不能用。而且protected訪問修飾符也不能使用,因為介面可以讓所有的類去實現(非繼承),不只是其子類,但是要用public去修飾。介面可以去繼承一個已有的介面。
題考察修飾符,函式定義等,故從網上搜羅了下相關資料,總結如下:
修飾符 |
類 |
成員訪求 |
構造方法 |
成員變數 |
區域性變數 |
|
abstract(抽象的) |
√ |
√ |
- |
- |
- |
|
static (靜態的) |
- |
√ |
- |
√ |
- |
|
public(公共的) |
√ |
√ |
√ |
√ |
- |
|
protected(受保護的) |
√ |
√ |
√ |
- |
||
private(私有的) |
- |
√ |
√ |
√ |
- |
|
synchronized(同步的) |
- |
√ |
- |
- |
- |
|
native(本地的) |
- |
√ |
- |
- |
- |
|
transient(暫時的) |
- |
- |
- |
√ |
- |
|
volatie(易失的) |
- |
- |
- |
√ |
- |
|
final(不要改變的) |
√ |
√ |
- |
√ |
√ |
|
類 修飾符 |
|
Public |
可以從其他類中訪問 |
Abstract |
本類不能被例項化 |
Final |
不能再宣告子類 |
建構函式修飾符 |
|
Public |
可以從所有的類中訪問 |
Protected |
只能從自己的類和它的子類中訪問 |
Private |
只能在本類中訪問 |
域/成員變數修飾符 |
|
Public |
可以從所有的類中訪問 |
Protected |
只能從本類和它的子類中訪問 |
Private |
只能從本類中訪問它 |
Static |
對該類的所有例項只能有一個域值存在 |
transient |
不是一個物件持久狀態的一部份 |
Volatile |
可以被非同步的執行緒所修改 |
final |
必須對它賦予初值並且不能修改它 |
區域性變數 修飾符 |
|
final |
必須對它賦予初值並且不能修改它 |
方法修飾符 |
|
Public |
可以從所有的類中訪問它 |
Protected |
只能從本類及其子類中訪問它 |
Private |
只能從本類中訪問它 |
abstract |
沒有方法體,屬於一個抽象類 |
final |
子類不能覆蓋它 |
static |
被綁定於類本身而不是類的例項 |
native |
該方法由其他程式語言實現 |
asnchronized |
在一個執行緒呼叫它之前必須先給它加 |
類的修飾符整合
一.類
類的修飾符:
Public:可以在其他任何類中使用,預設為統一包下的任意類。
Abstract:抽象類,不能被例項化,可以包含抽象方法,抽象方法沒有被實現,無具體功能,只能衍生子類。
Final:不能被繼承。
二.變數
變數修飾符:
一個類的成員變數的宣告必須在類體中,而不能在方法中,方法中宣告的是區域性變數。
1. 可訪問修飾符:
2. static:類變數:一個類所擁有的變數,不是類的每個例項有的變數。類變數是指不管類建立了多少物件,系統僅在第一次呼叫類的時候為類變數分配記憶體,所有物件共享該類的類變數,因此可以通過類本身或者某個物件來訪問類變數。
3. final:常量。
4. volatile:宣告一個可能同時被並存執行的幾個執行緒所控制和修改的變數。
例項變數:和類變數對應,即每個物件都擁有各自獨立的例項變數。
三.方法:(和變數物件分為例項方法和類方法,並用有無static修飾區別)
類方法:使用static關鍵字說明的方法
1.第一次呼叫含類方法的類是,系統只為該類建立一個版本,這個版本被該類和該類的所有例項共享。
2.類方法只能操作類變數,不能訪問例項變數。類方法可以在類中被呼叫,不必建立例項來呼叫,當然也可以通過物件來呼叫。
例項方法:例項方法可以對當前物件的例項變數操作,而且可以訪問類變數。
方法可以過載,要求:方法名相同,但是引數必須有區別。(引數不同可以使型別不同,順序不同,個數不同)
方法的返回型別:若無返回型別,則宣告為void.
方法中的變數作用域:
1. 成員變數:整個類。
2. 區域性變數:定義起到方法塊結束為止。
3. 方法引數:整個方法或者構造方法。
4. 異常處理引數:引數傳遞給異常處理方法。
構造方法:和類同名的方法。為新建物件開闢記憶體空間後,用於初始化新建的物件。不能用物件顯式的呼叫。
靜態初始化器:格式:static{<賦值語句組>}
靜態初始化器與構造方法的區別:
靜態初始化器 |
構造方法 |
對類的靜態域初始化 |
對新建的物件初始化 |
類進入記憶體後,系統呼叫執行 |
執行new後自動執行 |
屬特殊語句(僅執行一次) |
屬特殊方法 |
方法的修飾符:
抽象方法:用abstract修飾,只有宣告部分,方法體為空,具體在子類中完成。
類方法:靜態方法,用static修飾,
1. 呼叫時,使用類名作為字首,而不是類的某個例項物件名
2. 不能被單獨物件擁有,屬於整個類共享。
3. 不能處理成員變數。
最終方法:用final修飾,不能被子類重新定義的方法。
本地方法:用native修飾的方法,表示用其他語言書寫的特殊方法,包括C,C++,FORTRAN,組合語言等。
四.類成員的訪問控制符:
即類的方法和成員變數的訪問控制符,一個類作為整體物件不可見,並不代表他的所有域和方法也對程式其他部分不可見,需要有他們的訪問修飾符判斷。
許可權如下:
訪問修飾符 |
同一個類 |
同包 |
不同包,子類 |
不同包,非子類 |
private |
√ |
|
|
|
protected |
√ |
√ |
√ |
|
public |
√ |
√ |
√ |
√ |
預設 |
√ |
√ |
|
|