1. 程式人生 > 其它 >Java訪問許可權深入

Java訪問許可權深入

技術標籤:小白自學javajava

1、訪問控制權限修飾符可以修飾什麼?
屬性(四個都能)
方法(四個都能)
類(public 和預設能都) public class A 和 class A protected 和 private 不允許能用在類
介面()

2、重寫的訪問許可權的範圍(從小到大) (下面這個子類特指是屬性自身類的子類,要繼承父類然後才能訪問父類屬性)
在這裡插入圖片描述
public > protected > default > private

一、public
(1)定義:public是公共的,被public所修飾的成員可以在任何類中都能被訪問到。

(2)修飾的成分:

【1】public能用來修飾類,在一個java原始檔中只能有一個類被宣告為public,而且一旦有一個類為public,那這個java原始檔的檔名就必須要和這個被public所修飾的類的類名相同,否則編譯不能通過。
【2】說到這裡,穿插多一點知識。
①一個類作為外部類的時候只能被public或者預設訪問修飾符所修飾,
②但是一個類如果作為內部類的時候,則可以被四種訪問修飾符所修飾,因為一個類作為內部類的時候,就作為外部類的一個成員屬性了,因此可以有四種訪問修飾符修飾,這是內部類和外部類的一個區別。
String name ; private class User{ (例項內部類,不報錯)
}

private class User{ (外部類,報錯)
}

【3】public用來修飾類中成員(變數和方法),被public所修飾的成員可以在任何類中都能被訪問到。通過操作該類的物件能隨意訪問public成員。

public在類的繼承上的體現,被public所修飾的成員能被所有的子類繼承下來。

二、protected
(1)定義:protected是受保護的,受到該類所在的包所保護。

(2)作用域:被protected所修飾的成員會被位於同一package中的所有類訪問到。同時,被protected所修飾的成員也能被該類的所有子類繼承下來。(注意:這裡是指同一個package或者不同的package中的子類都能訪問)

三、friendly/default(預設,預設的)

(1)定義:friendly是友好的,即在成員的前面不寫任何的訪問修飾符的時候,預設就是友好的。所謂友好的,是對同一package的類友好。

(2)作用域:同一package中的所有類都能訪問。被friendly所修飾的成員只能被該類所在同一個package中的子類所繼承下來。(也就是說只有在同一個package中的子類才能訪問到父類中friendly修飾的成員)

四、private (封裝常用)
(1)定義:private是私有的,即只能在當前類中被訪問到,它的作用域最小。


①同包自身類訪問許可權:
(四種許可權都能訪問)

package com.bjpowernode03.javaSE.訪問許可權1;
import com.bjpowernode.javaSE.包和導包機制.packageimport使用例子;  
//在包機制下得import匯入包+類名,才可以直接訪問其他包的類物件

public class 同包自身類訪問許可權 {

        String name ; private class User{

    }
        private int id;
        protected boolean gender;
        public double moneybalance;
    public static void main(String[] args) {
        packageimport使用例子 p1 = new packageimport使用例子();
        p1.dosome();


        //經過測試訪問許可權全部都可以在同包屬性自身類中訪問;
        同包自身類訪問許可權 f1 = new 同包自身類訪問許可權();
        System.out.println(f1.name);
        System.out.println(f1.gender);
        System.out.println(f1.id);
        System.out.println(f1.moneybalance);
    }
}

②同包其他類中訪問許可權測試:
只有protected 和 public 和 預設default可以在同包其他類中訪問

package com.bjpowernode03.javaSE.訪問許可權1;

public class 同包其他類中訪問許可權測試 {
    public static void main(String[] args) {
        同包自身類訪問許可權 f2 = new 同包自身類訪問許可權();

        //經過測試,protected 和 public 和 預設default可以在同包其他類中訪問
        System.out.println(f2.gender);
        System.out.println(f2.moneybalance);
        System.out.println(f2.name);
//        System.out.println(f2.id);

    }
}

③非同包子類許可權測試:
只有protected ,public可以訪問

package com.bjpowernode04javaSE.訪問許可權2;

import com.bjpowernode03.javaSE.訪問許可權1.同包自身類訪問許可權;//匯入訪問控制權限包名

public class 非同包子類訪問許可權測試 {
    public static void main(String[] args) {
        同包自身類訪問許可權 c1 = new 同包自身類訪問許可權();
           c1.moneybalance  = 12346;  //public可以隨意訪問
//         c1.name = "林瑞儀";  default出了包就不認識了
//         c1.id = 123;    報錯private私有出了自身類無法訪問
//         c1.gender;  報錯,protected gender不能在非同包非子類中訪問。


    }
}
//定義一個非同包子類,下面這個子類特指是屬性自身類的子類,要繼承父類然後才能訪問父類屬性
class protected許可權測試 extends 同包自身類訪問許可權 { 
 //這裡protected許可權測試類 是非同包的子類
    public void doit(){

        //經過測試,非同包子類許可權只有protected ,public可以訪問
        this.moneybalance = 12345;
        this.gender = true;  //this表示當前protected許可權測試類的物件

    }
}

④非同包非子類訪問許可權測試:
只有public能訪問到

package com.bjpowernode04javaSE.訪問許可權2;

import com.bjpowernode03.javaSE.訪問許可權1.同包自身類訪問許可權;
public class 非同包非子類訪問許可權測試 {
    public static void main(String[] args) {
        同包自身類訪問許可權 f3 = new 同包自身類訪問許可權();
        //經過測試, 在非同包非子類訪問許可權測試,只有public能訪問到
        System.out.println(f3.moneybalance); //
//        System.out.println(f3.id);
//        System.out.println(f3.name);
//        System.out.println(f3.gender);


    }
}

訪問許可權注意點:
1、覆蓋的方法訪問許可權不能變低,可以更高。(即子類方法的訪問許可權得和父類一樣或者更開放)原因:
【1】(先記住這個和多型的實現有關,比如子類覆蓋方法中的許可權public變為protected 則訪問許可權就會更低了,也就無法直接通過父類引用去多型進入到子類的方法,因為多型時,編譯器會先去父類靜態找到父類方法,找到了編譯就通過然後才在執行時去動態去進入子類的方法。
【2】多型中,子類物件可以被當成父類物件使用。比如這樣A a = new B(),B子繼承了A父,假設現在重寫A父類public方法s(),如果在B中變為了private/protected私有方法,那麼呼叫a.s()會發生什麼?會無法被呼叫,許可權變低了。因為私有方法無法直接訪問,也就無法實現多型了
【3】通俗說:Java希望兒子一代更比一代強, 沒有說越傳越差的 只有更好。
2、覆蓋之後的方法,不能throws丟擲更多的異常,只能更少。