1. 程式人生 > >再談包訪問許可權 子類為何不能使用父類protected方法

再談包訪問許可權 子類為何不能使用父類protected方法

可見範圍

image

許可權的含義應該理解為控制範圍,要把它理解成一個限制範圍的空間,更為準確的說叫做可見範圍

訪問控制的等級,從最大許可權到最小許可權依次為:public、protected、包訪問許可權(沒有關鍵詞)、和private

  1. public 所有地方都可以訪問,沒有任何疑問
  2. private 只有自己本類可以訪問,沒有任何疑問
  3. 預設也就是包訪問許可權,顧名思義,包訪問許可權,也就是必須同一個包中才可以,即使是子類不在同一個包中也不行的
  4. protected是預設包訪問許可權的擴充套件,預設是出了包的範圍,就不行了,但是protected給予子類放行,即使是包的外部,當然同一個包中的子類肯定是可以的

簡單說就是:

  1. public 誰都可以看得見
  2. private只有自己看得見
  3. 預設包訪問 同一個包中看得見
  4. protected在預設包訪問的基礎上,子類自己看得見

示例:

image

package test.b;

import test.a.Super;

public class SubClass extends Super{

    public static void main(String[] args) {

        SubClass subClass = new SubClass();
         subClass.publicFun();
         subClass.protectedFun();

    }

}

列印資訊:

publicFun
protectedFun

子類位於不同的包中,可以訪問公有方法,可以訪問protected方法 不能訪問預設的包訪問許可權以及私有的

額外的例子:

package test.b;

import test.a.Super;

public class SubClass extends Super {

    public static void main(String[] args) {

        Super superClass = new Super();
         superClass.publicFun();

        superClass.protectedFun();

    }

}

編譯器直接報錯

image

如果非要執行,也是直接報錯

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
     The method protectedFun() from the type Super is not visible

    at test.b.SubClass.main(SubClass.java:12)

相信也有不少人人把上面這種形式的程式碼理解為:子類中訪問父類的protected方法

並且覺得很奇怪,並且認為  子類不同包中並不能訪問父類的protected方法

其實這是概念錯了

雖然是在子類中,但是卻是使用父類的物件,呼叫父類的protected方法

這是在不同包中,訪問protected方法 當然是錯誤的  

protected的含義是指子類可以訪問,說的是子類直接訪問父類的protected方法

而不是說子類中,可以呼叫父類的物件訪問父類的protected方法

子類可以訪問,可以在子類訪問不是一個概念

你可以訪問和在你家訪問顯然差別很大

總結:

public 什麼都不用管,誰都可以用

private  只有自己本類可以用,本類自然限定到某個Class定義範圍,哪怕你定義類或者子類在同一個檔案中,都是白扯

預設的包訪問許可權 同一個包中,不管其他條件,管你是不是子類都沒關係的,不要自己去混淆

protected 就是預設的包訪問許可權擴充套件了一下,  子類物件可以訪問,不管是不是同一個包,而不是在子類中用父類物件訪問

關於protected關鍵點在於:

先看下官方文件中的說明:

A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members,

A subclass inherits all of the public and protected members of its parent

A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.

子類繼承父類所有的成員 包括 屬性方法以及巢狀類,不包括構造方法

子類繼承所有的public和protected 的成員

子類不繼承私有的成員,不過如果父類中有public或者protected 方法訪問私有成員,子類可以使用

子類繼承了父類的protected方法,所以子類有這個方法,所以子類可以使用,但是子類是不能讀取某個父類物件的保護方法的(在包外)

繼承是繼承的結構,跟任何具體的物件的資料沒關係,所以子類中不能建立父類的物件然後呼叫父類的protected方法,不能在包外訪問protected方法

但是如果父類的方法是protected static的,可以在子類中建立父類物件然後呼叫方法

因為子類是繼承的父類的,著重點在於類,繼承了類的成員,類的,類的