1. 程式人生 > 實用技巧 >Java的修飾符

Java的修飾符

引言:Java的修飾符根據修飾的物件不同,分為類修飾符、方法修飾符、變數修飾符,其中每種修飾符又分為訪問控制修飾符和非訪問控制修飾符。訪問控制存在的原因:a、讓客戶端程式設計師無法觸及他們不應該觸及的部分 b、允許庫設計者可以改變類內部的工作方式而不用擔心影響到客戶端程式設計師。

目錄

一、 類修飾符

二、方法修飾符

三、變數修飾符

四、訪問控制修飾符總結


一、 類修飾符

1.訪問修飾符:公共類修飾符public

公共類修飾符 public : Java 語言中類的訪問控制符只有 public 即公共的。每個 Java 程式的有且只有一個類是 public,它被稱為主類 ,其他外部類無訪問控制修飾符,具有包訪問性。注意:一個類的內部類可以被其他訪問控制修飾符protected、default、private修飾,相當於類的成員。

2.非訪問控制符:抽象類修飾符 abstract 、最終類修飾符 final

(1)抽象類修飾符 abstract :用 abstract 修飾符修飾的類,被稱為抽象類。

(2)最終類修飾符 final :當一個類不能被繼承時可用修飾符 final修飾為最終類。被定義為 final 的類通常是一些有固定作用、用來完成某種標準功能的類。

(3)類預設訪問控制符:如果一個類沒有訪問控制符,說明它具有預設的訪問控制符特性。此時,這個類只能被同一個包中的類訪問或引用。這一訪問特性又稱為包訪問性。

二、方法修飾符

1.訪問控制修飾符

公共訪問控制符public、保護訪問控制符protected、預設預設default

、私有訪問控制符private

2.非訪問控制修飾符

抽象方法控制符abstract 、靜態方法控制符static 、最終方法控制符final 、本地方法控制符native 、同步方法控制符synchronized

(1)抽象方法控制符 abstract :abstract 修飾的方法稱為抽象方法。抽象方法僅有方法頭,沒有方法體和具體實現。

(2)靜態方法控制符 static :用修飾符 static 修飾的方法稱為靜態方法。靜態方法是屬於整個類的類方法;而不使用static 修飾、限定的方法是屬於某個具體類物件的方法。 由於 static方法是屬於整個類的,所以它不能操縱和處理屬於某個物件的成員變數,而只能處理屬於整個類的成員變數,即 static 方法只能處理 static的域。

(3)最終方法控制符 final :用修飾符 final修飾的方法稱為最終方法。最終方法是功能和內部語句不能更改的方法,即最終方法不能重寫覆蓋。final固定了方法所具有的功能和操作,防止當前類的子類對父類關鍵方法的錯誤定義,保證了程式的安全性和正確性。所有被 private 修飾符限定為私有的方法,以及所有包含在 final 類 ( 最終類) 中的方法,都被認為是最終方法。

(4)本地方法控制符 native :用修飾符 native 修飾的方法稱為本地方法。為了提高程式的執行速度,需要用其它的高階語言書寫程式的方法體,那麼該方法可定義為本地方法用修飾符 native 來修飾。

(5)同步方法控制符 synchronized :該修飾符主要用於多執行緒程式中的協調和同步。

三、變數修飾符

1.訪問控制符

公共訪問控制符public 、保護訪問控制符protected 、預設預設訪問控制符default、私有訪問控制符private

(1)公共訪問控制符 public:用 public 修飾的域稱為公共域。由於 public 修飾符會降低執行的安全性和資料的封裝性,所以一般應減少 public 域的使用。

(2)私有訪問控制符 private:private 修飾的成員變數只能被該類自身所訪問,不能被其它任何類 (包括子類) 訪問。

(3)保護訪問控制符 protected:用 protected 修飾的成員變數可以被三種類所引用:①該類自身;②同一個包中的其它類;③其它包中的子類。使用修飾符 protected 的主要作用是允許其它包中的子類來訪問父類的特定屬性。

(4)預設預設修飾符 :沒有訪問控制符或者是用default修飾的成員變數可以被該類本身或同一包中的其他類訪問。

2.非訪問控制符

靜態域修飾符static 、最終域修飾符 final 、易失 ( 共享 ) 域修飾符volatile 、暫時性域修飾符transient

(1)靜態域修飾符 static :用 static修飾的成員變數僅屬於類的變數,而不屬於任何一個具體的物件,靜態成員變數的值是儲存在類的記憶體區域的公共儲存單元,而不是儲存在某一個物件的記憶體區間。該類的任一物件訪問它時取到的都是相同的資料;該類的任一物件修改它時 , 也都是對同一個記憶體單元進行操作。

(2)最終域修飾符 final :最終域修飾符 final 是用來定義常量的。一個類的域 ( 成員變數 ) 如果被修飾符 final 說明,則它的取值在程式的整個執行過程中都是不變的。

(3)易失 ( 共享 ) 域修飾符 volatile :易失 ( 共享 ) 域修飾符 volatile是用來說明這個成員變數可能被幾個執行緒所控制和修改。也就是說在程式執行過程中,這個成員變數有可能被其它的程式影響或改變它的取值。通常 volatile 用來修飾接受外部輸入的域。

(4)暫時性域修飾符 transient :暫時性域修飾符 transient 用來定義一個暫時性變數。其特點是:用修飾符transient 限定的暫時性變數,將指定 Java虛擬機器認定該暫時性變數不屬於永久狀態,以實現不同物件的存檔功能。否則,類中所有變數都是物件的永久狀態的一部分,儲存物件時必須同時儲存這些變數。

四、訪問控制修飾符總結

提示:同一個包中的本類、子類、普通類、另一個包中的普通類,指的均是在當前這個類中,新建的物件例項或者物件例項的子類,可以訪問這個物件例項的哪些屬性和方法,而另一個包中的子類這一列protected修飾的,指的僅僅是子類的例項,父類的例項不能訪問。
注意:protected修飾的屬性或方法,允許不同包的子類中訪問。注意這裡的訪問方式是通過繼承訪問父類中的protected屬性或方法,而不是直接通過父類例項訪問protected屬性或方法

public class Animal{
    protected String name;
    public int age;
}
 
不同包的子類
public class Cat extends Animal{
    public void print(){
        /*********通過父類直接訪問*********/
        Animal a = new Animal();
        System.out.println(a.name);   //不允許
        System.out.println(a.age);   //允許
        /*********通過繼承訪問*********/
        System.out.println(this.name);   //允許
        System.out.println(this.age);   //允許
 
    }
}