Java訪問許可權深入
1、訪問控制權限修飾符可以修飾什麼?
屬性(四個都能)
方法(四個都能)
類(public 和預設能都) public class A 和 class A protected 和 private 不允許能用在類
介面()
2、重寫的訪問許可權的範圍(從小到大) (下面這個子類特指是屬性自身類的子類,要繼承父類然後才能訪問父類屬性)
public > protected > default > private
一、public
(1)定義:public是公共的,被public所修飾的成員可以在任何類中都能被訪問到。
(2)修飾的成分:
【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.包和導包機制.package和import使用例子;
//在包機制下得import匯入包+類名,才可以直接訪問其他包的類物件
public class 同包自身類訪問許可權 {
String name ; private class User{
}
private int id;
protected boolean gender;
public double moneybalance;
public static void main(String[] args) {
package和import使用例子 p1 = new package和import使用例子();
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丟擲更多的異常,只能更少。