1. 程式人生 > >public、friendly、protected、private訪問許可權修飾符

public、friendly、protected、private訪問許可權修飾符

許可權修飾詞

定義:就是用於控制被修飾變數、方法、類的可見範圍。

使用的必要性:

一個Java應用有很多類,但是有些類,並不希望被其他類使用。每個類中都有資料成員和方法成員,但是並不是每個資料和方法,都允許在其他類中呼叫。為了更好的控制這些屬性和方法的被訪問的許可權問題,就需要使用訪問許可權修飾符。

修飾詞的劃分:根據作用範圍來進行劃分。

所在的類 private 預設的(default/friendly) protected public
同一個類中 可見 可見 可見 可見
同一個包中 不可見 可見 可見 可見
不同的包中有繼承關係 不可見 不可見 可見 可見
不同的包中沒有繼承關係 不可見 不可見 不可見 可見

四種訪問許可權的具體講解:

A. public修飾:只能修飾類、方法(含構造方法)、成員變數。其修飾的部分所有人都能訪問。
* 程式碼展示:

    public class All {
        public static void main(String[] args) {
            One one = new One();
            System.out.println(one.name);
        }
    }
    class One {
        public
String name = "小明"; }
  • 說明:因為One類的name屬性為public修飾的,所以類外界可以直接訪問(one.name)這個屬性。

B. private:只能修飾方法(含構造方法)、成員變數。其修飾的部分只能在自身類中訪問。例如將某類的構造方法設定為private,那麼在其它類中就不能呼叫“new”來建立該類的例項,通常在該類中會對外提供一種方法,該方法能返回該類的例項; 再例如我們經常將成員變數設定為private的,對外提供set/get方法對其進行訪問,在set/get方法中可做一些比如許可權檢測等操作,而不是將域直接暴露給所有使用者。

  • 程式碼展示:
    public class All {
        public static void main(String[] args) {
            One one = new One();
            System.out.println(one.name);
            System.out.println(one.getName2());
        }
    }

    class One {
        public String name = "小明";
        private String name2 = "小紅";
        public String getName2() {
            return name2;
        }
        public void setName2(String name2) {
            this.name2 = name2;
        }
    }
  • 說明:因為One類的name2屬性為private修飾的,所以類外界不可以直接訪問這個屬性,必須要通過特定的方法才能操作這個屬性,也就是例子中的getName2(),setName2(String name2)兩個方法來操作,setName2()這個方法是設定這個屬性的值,getName2()這個方法是得到這個屬性的值,這也是封裝性的體現。

C. protected:只能修飾方法(含構造方法)、成員變數。進一步解釋:父類的protected成員是包內可見的,並且對子類可見;若子類與父類不在同一包中,那麼在子類中,子類例項可以訪問其從父類繼承而來的protected方法,而不能訪問父類例項的protected方法。
* 程式碼展示:

    package com.luodesong.bean;

    public class Test1 {
        protected String name;
    }
    package com.luodesong.test;

    import com.luodesong.bean.Test1;

    public class All {
        public static void main(String[] args) {
            test1.name;//這句程式碼會報錯,不能呼叫。
        }
    }
  • 說明:Test1類和All類不在同一個包下面;同時,Test1中的name屬性用的是protected許可權修飾符修飾的,所以 test.name 這句程式碼不能編譯通過。想要能使用,就必須放在一個包下或者是通過繼承來實現。
  • 放在同一個包下的程式碼為:
    package com.luodesong.test;

    public class All {
        public static void main(String[] args) {
            One one = new One();
            String name = one.name;
            System.out.println(name);
        }
    }

    class One {
        protected String name = "小明";
    }
  • 通過繼承實現的方式為:
    package com.luodesong.bean;

    public class Test1 {
        protected String name = "小紅";
    }
    package com.luodesong.test;

    import com.luodesong.bean.Test1;

    public class All {
        public static void main(String[] args) {
            One one = new One();
            String name = one.name;
            System.out.println(name);
        }
    }

    class One extends Test1 {
        public String name = super.name;
    }

D. 預設修飾符(friendly):這個較為簡單隻能修飾類、方法(含構造方法)、成員變數。其修飾的部分只有同一包內的類能訪問,對於這個包之外的所有類,這個成員是private的。

注意:

  1. 在同一包中具有包訪問許可權,相當於預設(friendly)訪問許可權。
  2. 在子類中,可繼承不同包內父類的protected方法和屬性,也只能在該子類中訪問(除非重寫方法或屬性)。