Java訪問權限控制(private,default,protected,public)


Java有四種訪問控制權限:private,default,protected,public

 

 

一、private

我們在代碼中做演示

 創建Person類,以Person類為主線,驗證它的成員函數和成員變量在不同類、包、子類情況下的訪問權限

 

(注意:包的命名要求包含字符均為小寫,同時不能有特殊字符)

我們先為Person類創建private修飾的成員變量,測試在同一個類中是否可以使用

package example;

public class Person {
    private String name;

    public static void main(String[] args) {
        Person person = new Person();
        person.name = "艾邊成";
    }
}

 

編譯器未報錯,表示說private修飾的成員變量可以在同一個類中被調用

接着我們在同一個包下的TestPerson類中試着去調用Person類中private修飾的name

編譯器報錯,表示說private修飾的成員變量不能在同一個包中使用

接下來我們創建Student類,測試Person類的子類是否可以調用private修飾的成員變量

編譯器報錯,表示說 (Student) 即便是Person的子類,也不能訪問Person中private修飾的成員變量

這樣看來,修飾符 private 的作用是很強的,只用在自己的類中才能被訪問,超過了這個類,誰都不行

 

二、default

default 是默認修飾符,即成員函數或成員變量前沒有修飾符時,默認訪問權限為 default

package example;

public class Person {
    String gender;      //性別    無修飾符,默認為 default(默認)

    public static void main(String[] args) {
        Person person = new Person();
        person.gender = "男";
    }
}

當在同一個包下嘗試調用時

package example;

public class TestPerson {
    public static void main(String[] args) {
        Person person = new Person();
        person.gender = "女";
    }
}

編譯器未報錯,可正常調用

當在子類中嘗試調用時

 

編譯器顯示正常,但是值得注意的是,此時子類和我們的Person類在同一個包下,可歸為上一種情況

於是我們在另一個包 (other) 中創建Person類的子類 Student

 

此時編譯器報錯,表示說默認修飾符 default 不能在子類中被調用,

當然此處的“子類”一定指和父類不在同一個包,我們用 import 導入所在的包中需要的類

三、protected

同樣的方法,我們選擇不同的位置逐個去測試

package example;

public class Person {
    protected int age;

    public static void main(String[] args) {
        Person person = new Person();
        person.age = 18;
    }
}

同一個類中沒有問題

package example;

public class TestPerson {
    public static void main(String[] args) {
        Person person = new Person();
        person.age = 18;
    }
}

 

同一個包中沒有問題

當在不同包的子類中調用時,有意思的事情發生了

 

編譯器報錯,這不符合我們的預期:在子類中是可以訪問到protected的

老師告訴我們(后續我們會做出解釋):不同包下的對象,不能直接通過父類對象去訪問

我們要使用繼承來稍稍改變代碼

package other;

import example.Person;

public class Student extends Person{
    public static void main(String[] args) {
        Person person = new Person();

        Student student = new Student();
        student.age = 18;
    }
}

顯示正常,用protected修飾的屬性,子類可以繼承過來,不在父類同一個包下也是可以繼承訪問到的

如果這時將繼承用在同一個包下的Student類中,一定也是可以的

package example;

public class Student extends Person{
    public static void main(String[] args) {
        Person person = new Person();
        person.age = 18;

        Student student = new Student();
        student.age = 18;
    }
}

這是從繼承的角度講的(以后我們會解釋)

四、public

任何地方都可以訪問到

 

Java面向對象之包和內部類_基礎課程_華為雲學院_雲計算培訓-華為雲 (huaweicloud.com)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM