公開:public,對外公開。
受保護:protected,向子類及同一個包中的類公開。
默認:沒有修飾符,向同一個包中的類公開。
私有:private,只有類本身可以訪問,不對外公開。
成員變量,成員方法和構造方法可以處於4個訪問級別中的一個。
頂層類(非內部類)只可以處於 公開 或 默認的訪問級別。不能用protected和private來修飾。(修飾頂層類的修飾符包括abstract,public和final,而static,protected和private不能修飾頂層類;成員方法和成員變量可以有多種修飾符,而局部變量只能用final修飾。)
◆abstract修飾符:
可用於修飾類和成員方法。
抽象類不能被實例化。
抽象方法沒有方法體。抽象方法用來描述系統具有什麼功能,但是不提供具體實現。
它的語法規則如下:
抽象類可以沒有抽象方法。但是包含了抽象方法的類一定是抽象類。(即抽象方法必須是在抽象類中定義。)
沒有抽象構造方法,也沒有抽象靜態方法。
抽象類及抽象方法不能被final,static,private修飾符修飾。(原因:static方法必須被實現,abstract方法沒有方法體,矛盾;final修飾的類不能被繼承,沒有子類,而抽象類必須是被繼承實現的;.....)
◆final修飾符:
final具有“不可改變”的含義,它可以修飾非抽象類,非抽象成員方法和變量,。
用final修飾的類不能被繼承,沒有子類。
用final修飾的方法不能被子類的方法覆蓋。
用final修飾的變量表示常量,只能賦一次值。
不能用來修飾構造方法。
final修飾的變量必須顯式的初始化。(對於final類型的實例變量,可以在定義變量時,或在構造方法中進行初始化;對於final類型的靜態變量,可以在定義變量時,或在靜態代碼塊中初始化。)
◆static修飾符
可以修飾類的成員變量,成員方法和代碼塊。
用static修飾的成員變量表示靜態變量,可以直接通過類名來訪問。
用static修飾的成員方法表示靜態方法,可以直接通過類名來訪問。
用static修飾的程序代碼塊表示靜態代碼塊,當java虛擬機加載該類時,就會執行該代碼塊。且只執行一次。
注:被static所修飾的成員變量和成員方法表明被某個類所有,它不依賴於類的特定實例,被類的所有實例所共享。只要這個類被加載,java虛擬機就能根據類名在運行時數據區的方法區找到它們。
類的成員變量分2種:
被static修飾的類的成員變量,叫類變量(靜態變量);
另一種沒有被static修飾的變量,叫實例變量。
類變量(靜態變量)和實例變量的區別:
靜態變量在內存中只有一個拷貝。可以直接通過類名來訪問。
實例變量,每創建一個實例,就會爲實例變量分配一次內存,實例變量可以在內存中有多個拷貝,互不影響。
static方法
因爲靜態方法不需要通過它所屬的類的任何實例就會被調用,因此在靜態方法中不能使用this,super關鍵字;不能直接訪問所屬類的實例變量和實例方法,但是可以直接訪問所屬類的靜態變量和靜態方法;
靜態方法用來表示某個類所特有的功能,這種功能的實現不依賴於類的具體實例,也不依賴於它的子類。因此靜態方法必須被實現。
作爲程序入口的main()方法是靜態方法(因此也符合上述要求)。原因:只要java虛擬機加載了main()所屬的類,就能執行main()方法,而無需先創建這個類的實例。
static代碼塊
不存在於任何方法體中,java虛擬機在加載類時,會依順序,首先執行這些代碼塊。且只執行一次。
通常,類的靜態代碼塊用於初始化類,給類的靜態變量賦初始值,而類的構造方法用於初始化類的實例;
靜態代碼塊和靜態方法一樣,也不能直接訪問類的實例變量和實例方法。而必須通過實例的引用來訪問它們。
備註:使用多個修飾符,順序可以顛倒,但是作爲規範,通常是
訪問控制修飾符-->static/abstract-->其它。