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

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

空間 什麽 -i height nested blog size void main

可見範圍

技術分享圖片

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

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

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

簡單說就是:

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

示例:

技術分享圖片

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();

    }

}

編譯器直接報錯

技術分享圖片

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

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的,可以在子類中創建父類對象然後調用方法

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

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