在java編程語言里,修飾符是出現在類的定義、屬性、方法、構造器、初始化塊等定義時的修飾。修飾符有分為訪問修飾符和可選修飾符,他們基本都是關鍵字,有一個例外,就是訪問修飾符除了public/protected/private之外還有一個默認訪問修飾符,共4種。而可選修飾符則有abstract/const/default/final/native/static/strictfp/synchronized/transient/volatile。
修飾符
|
修飾場景 |
||||
類 |
成員方法 |
構造方法 |
成員變量 |
局部變量 |
|
abstract(抽象的) |
√ |
√ |
- |
- |
- |
static (靜態的) |
- |
√ |
- |
√ |
- |
public(公共的) |
√ |
√ |
√ |
√ |
- |
protected(受保護的) |
- | √ |
√ |
√ |
- |
private(私有的) |
- |
√ |
√ |
√ |
- |
synchronized(同步的) |
- |
√ |
- |
- |
- |
native(本地的) |
- |
√ |
- |
- |
- |
transient(暫時的) |
- |
- |
- |
√ |
- |
volatile(易失的) |
- |
- |
- |
√ |
- |
final(不要改變的) |
√ |
√ |
- |
√ |
√ |
無訪問修飾符(默認,同包訪問) |
√ |
√ |
√ |
√ |
- |
由上表可以明顯地看出各修飾符可出現的位置。
const是一個C語言的關鍵字,它限定一個變量不允許被改變。使用const在一定程度上可以提高程序的安全性和可靠性。java中保留了此關鍵字,但是編者並沒有發現它在java中的用法。另外,在觀看別人代碼的時候,清晰理解const所起的作用,對理解對方的程序也有一些幫助。
下面將按位置,對修飾符進行分析:
1.類
類一般情況下只有public/abstract/final和默認修飾符是被允許的,但是有一個例外,那就是在內部類中,是允許static修飾的。
public:表示該類可以被任意位置的類訪問,默認(不寫)表示該類被同包中的其他類訪問。
abstract:表明該類為抽象類,不能被實例化。應注意類為abstract修飾時,不要求其中有抽象abstract方法,而類中有抽象方法時,該類就必須成為抽象類。
final:表明該類為最終類,不能被繼承(擴展)。應注意類為final修飾時,依然可以繼承其他類和實現接口。
static:外部類是不允許static修飾的,但是內部類卻允許:class Outter{ static class Inner{} } 此時 可以直接通過外部類的類名產生一個內部類的實例:new Outter.Inner(); 而不需要先產生一個外部類的實例 class Outter{ class Inner{} },
Outter outter = new Outter();
outter.new Inner();
當內部類不是static時,只能通過外部類的實例產生內部類對象。
2.成員變量
一個類的成員變量的聲明必須在類體中,而不能在方法中,方法中聲明的是局部變量。
訪問修飾符可以是4種中的任意一種。
static:類變量:一個類所擁有的變量,該類型的變量與類的實例對象無關,不管類創建了多少對象,系統僅在第一次調用類的時候為類變量分配內存,所有對象共享該類的類變量,因此可以通過類本身(類名)或者某個對象來訪問類變量。
final:常量。成員變量定義時一般可以不初始化(給變量賦初值),但是final修飾成員變量時,必須在定義時就初始化,如: final int age = 20;這里的“=20”不能不寫,否則編譯就會報錯。
volatile:聲明一個可能同時被並存運行的幾個線程所控制和修改的變量。
transient:聲明一個該值不能被序列化的變量(對象被序列化后,該變量仍然存在,值以該類型的默認值來保存,如整型為0,String類型為null,boolean類型為false)。
3.方法
訪問修飾符可以是4種中的任意一種。
abstract:抽象方法:只有聲明部分,方法體為空,具體在子類中完成。
static:類方法、靜態方法:
1) 調用時,可以直接使用類名調用,也可以類的某個實例對象名調用
2)不能被單獨對象擁有,屬於整個類共享。
3) 不能處理非static修飾的成員變量。
final:最終方法,不能被子類重寫的方法。
native:本地方法,表示用其他語言書寫的特殊方法,包括C,C++,FORTRAN,匯編語言等。
synchronized:多線程調用時同步,當此方法被調用時,其他線程不能夠調用該方法,直到該方法返回,用於避免在多線程操作時,數據的結果出現不一致。
4.局部變量
只能有final修飾,不能夠有訪問修飾符修飾。
5.接口
接口的訪問修飾符只能有public/默認不寫(同包) 兩種,其可選修飾符只能為abstract(abstract也可以不寫,接口默認即為抽象)。
接口中的變量只能為 public static final 聯合修飾的公共靜態常量(這三個修飾符可以不寫,接口中變量為默認有這三個修飾符,此外 final 類型的變量必須 在定義時初始化(賦初值),這點在上文的【變量】中已經說過 )
接口中的方法訪問修飾符只能為public,一般情況下可選修飾符為abstract,即接口中的方法為默認抽象方法,不能有方法體。
此外,還可以有strictfp/static/default修飾(其中static和default只能二者選其一,strictfp必須與static和default中的一個配合使用)
static:靜態方法 必須有方法體。
default:修飾的方法 必須有方法體。
strictfp:strict floatpoint 精確浮點
注意:類與接口的關系為多實現,當類實現的多個中有同名、同參、同返回類型的 抽象方法或者default方法時(包括兩個都為抽象、兩個都為default 和 一個為抽象一個為default ),實現類必須重寫該方法。
而接口中的方法為靜態(static)方法時,可以直接用接口名調用該方法,與實現類無關。實現類可以有與之相同的靜態或非靜態方法。
6.構造方法
構造方法前不能有返回類型,但是有一個例外:可以有一個void返回類型,一般默認不寫,但是寫上這個void(無返回值)修飾也不會有錯。