JAVA的訪問控制2-public,protected,private和package-private

JAVA的訪問控制2-public,protected,privatepackage-private

在前文JAVA的訪問控制1-訪問控制的必要性,包中介紹了訪問控制的由來以及包的概念,本文將繼續(xù)介紹訪問控制的關鍵字publicprotected,private以及沒有關鍵字時默認的package-private。
這些關鍵字可以用于修飾字段,方法和內部類,另外,只有public和默認的package-private可以用于外部類定義。

package-private默認權限

當字段等沒有任何修飾符時,就是默認權限,也就是包訪問權限。包訪問權限可以讓當前包的所有類進行調用,其他包的類則無法調用。
比如,類Persion在包org.xxx.model下,代碼如下:

package org.xxx;

public class Person {
    String name;

    String getName() {
        return name;
    }
}

那么,同樣在包org.xxx.model下的其他類就可以訪問到name字段和getName()方法,而其他包,比如org.xxx.util包下的類,就無法訪問。
默認權限的一個用途是單元測試,被測試類中一些待測試字段和方法設置為默認權限,測試類可以方便地設置和調用。
大部分的方法都可以設置為包訪問權限。

public

public關鍵字表示所有人都可以訪問,通常是用于對外開放的方法上,如下所示:

package org.xxx.package1;

public class Formatter{
    public String describe() {
        return "formatter";
    }
}

Formatter的包是org.xxx,提供了一個describe()的方法,該方法可以被任何類調用。可以像下面這樣來使用:

package org.xxx.package2;

import org.xxx.package1.Formatter;

public class User{
    public String describeFormatter() {
        Formatter formatter = new Formatter();
        return formatter.describe();
    }
}

使用Formatter的類位于另一個包下面,是可以正常使用的。

一般而言,不建議public修飾字段,如果開放某個字段,可以提供對應的gettersetter方法,比如:

public class Person {
    // private修飾符 后面會提到
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

這個也叫java bean,是一種非常常見的使用方法。

public修飾字段一般是用于常量的聲明,比如一周有七天,很多地方需要使用這個信息,就可以聲明一個常量public static final int DAYS_OF_WEEK = 7;,后面需要用這個數(shù)字進行計算的都使用DAYS_OF_WEEK常量來計算,可以使代碼比較清晰明了。

private

private關鍵字意味著這個方法/字段無法被其他類以常規(guī)方法(非常規(guī)方法指反射)訪問,包括同一個包里面的其他類,也無法訪問。下面是一個樣例:

public class Constants {
    public static final int DAYS_OF_WEEK = 7;

    private Constants() {
    }
}

這個樣例中,private被用到了構造器上,說明這個類無法被其他類通過new Constants()的方法實例化,原因是這個類是用于定義常量的類,它本身不需要被實例化。上文提到的常量一般可以通過這種方式定義。
如果某個常量只在一個類里面使用,也可以直接定義在類內部,比如:

public class WeekUtil {
    private static final int DAYS_OF_WEEK = 7;

    public static int daysOfWeeks(int weekNum) {
        return DAYS_OF_WEEK * weekNum;
    }
}

daysOfWeeks(int weekNum)方法可以計算指定周數(shù)有多少天,這里就使用private來定義了DAYS_OF_WEEK常量。

protected

protected修飾的內容可以被子類訪問,無論子類在哪個包下都可以。

比如我們有一個類Animal在包org.example下,聲明了一個age字段:

package org.example;

public class Animal {
    protected int age;
}

有一個類Duck繼承了這個類,它在org.example.duck下:

package org.example;
import org.example.Animal;

public class Duck extends Animal{
    public int ageOfDuck(){
        return age;
    }
}

Duck中是可以自由使用age字段的。

package-privateprotected

這兩種權限很容易混淆,在使用時,可以分開來看。兩種權限是相互獨立的,只要滿足其中一條就可以訪問到。比如上文的類Animal,加了個字段:

package org.example;

public class Animal {
    protected int age;
    String name;
}

子類在org.example包里面時,包權限生效,name可以被訪問到,子類不在org.example里面時,只能訪問到age。同一個包里面的其他類,只能訪問到name字段。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容