Java關鍵字(一) 修飾符private、protected、public和default的作用域


一、private、protected、public和default的作用域

我們經常用着四種修飾符去修飾變量、方法和類,但是這四種的作用域都一樣嗎? 其中private和public可能是最多人知道的,但是protected和default可能就不知道其具體的作用域是哪些范圍。先對其四種進行說明再通過案例進行證明:

public:具有最大訪問權限。 可以被同一項目下的任何類所調用,一般用於對外的情況。

protected:與public不同的是不同包下的類是不能使用的,但是其子孫類除外。所以我認為這是特意為子類設計的。

default:它是針對本包設計的,它所修飾的在本包下的其他類都訪問。

private:只為類本身提供。是一種封裝的體現。

 

二、案例

案例:先聲明一個類,可以供子類繼承。

package com.yuanfy.test.scope1;
/**
 * @Description: 父類,其中有四種修飾符所修飾的變量和方法
 * @author yuanfy
 * @date 2017年12月8日 下午5:04:35 
 */
public class Person {
    private String name;
    int age;
    protected String color;
    
    public Person(){}
    
    public Person(String name, int age, String color) {
        super();
        this.name = name;
        this.age = age;
        this.color = color;
    }

    public void say(){
        System.out.println(this.name + " say: I am " + this.color + " Person");
    }
}

測試1:同包下面測試 四種作用域,從中可以看出private不支持在同包下的其他類使用,其他三種是支持在同包下其他類調用的。

package com.yuanfy.test.scope1;
/**
 * @Description: 同包下面測試 四種作用域
 * @author yuanfy
 * @date 2017年12月8日 下午5:11:12 
 */
public class PersonTest {
    public static void main(String[] args) {
        Person person = new Person("James", 32, "red");
        System.out.println("name:" + person.name);//編譯報錯,所以private修飾的 是不能在同包下的其他類訪問
        System.out.println("age:" + person.age);// default
        System.out.println("color:" + person.color);//protected
        person.say();//public
    }
}

 測試2:在子孫類下測試 四種作用域(不同包的情況下,同包相當於測試1),從下面測試代碼中可以看出:private和default所修飾的,不支持在子孫類下調用的,其他兩種是支持在子孫類下調用的。

 1 package com.yuanfy.test.scope2;
 2 import com.yuanfy.test.scope1.Person;
 3 /**
 4  * @Description: 在子孫類下測試 四種作用域
 5  * @author yuanfy
 6  * @date 2017年12月8日 下午5:24:30 
 7  */
 8 public class BlackPerson extends Person{
 9 
10     public BlackPerson(String name, int age) {
11         super(name, age, "black");
12     }
13     public static void main(String[] args) {
14         BlackPerson person = new BlackPerson("James", 32);
15         
16         System.out.println("name:" + person.name);//private 編譯報錯,所以private修飾的 是不能在不同包下的子孫類訪問
17         System.out.println("age:" + person.age);// default  編譯報錯,所以default修飾的 是不能在不同包下的子孫類訪問
18         System.out.println("color:" + person.color);//protected 
19         person.say();//public
20     }
21 }

測試3:不同包下面測試 四種作用域,從下面測試案例中可以看到只有public才支持不同包下的其他類(子孫類除外)調用,其他三種都不支持。

 1 package com.yuanfy.test.scope2;
 2 
 3 import com.yuanfy.test.scope1.Person;
 4 
 5 /**
 6  * @Description: 不同包下面測試 四種作用域
 7  * @author yuanfy
 8  * @date 2017年12月8日 下午5:11:12 
 9  */
10 public class PersonTest2 {
11     public static void main(String[] args) {
12         Person person = new Person("James", 32, "red");
13         
14         System.out.println("name:" + person.name);//private 編譯報錯,所以private修飾的 是不能在其他包下的任何類訪問(除了自身)
15         System.out.println("age:" + person.age);// default 編譯報錯,所以default修飾的  是不能在其他包下訪問的。
16         System.out.println("color:" + person.color);//protected 編譯報錯,所以default修飾的  是不能在其他包下訪問的。
17         person.say();//public
18     }
19 }

所以經過上面案例分析可以得出他們分別對應有效的作用域,如下表:

作用域 當前類 同一包內 子孫類(不同包) 其他包
public
protected ×
default × ×
private × × ×
 

 


免責聲明!

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



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