Java 中關於default 訪問權限的討論


  Java中關於成員變量訪問權限問題一般書中會給出如下表格:

                      

簡單地描述一下表中的內容:用private 修飾的成員變量只能在類內部訪問;用default修飾的成員變量可以再內部訪問,也可以被同個包(同一目錄)中的類訪問;default修飾的成員變量既可以在類內部訪問,又可以被同個包中的類訪問,還能被子類訪問;public可以被任何地方的類訪問。

  我們可以用隱私程度來表示各種修飾符的權限,即:private > default > protected > public。private 、 protected 、public我們先不討論其訪問,我們着重討論default的訪問權限。在定義類的成員變量時,不用default去修飾成員變量,即是說,如果沒有修飾符Java就將它默認是default類型的成員變量,如:int age; 。如果加了default則編譯時會報錯。按照以上說法,default型的成員變量是不能夠在子類中被訪問的,但是,事實上是不是如此呢?其實不然,這里缺少了一個限制條件,那就是子類和父類不在同一包中時,default型的成員變量是不能夠在子類中被訪問。即是說,如果子類和父類在同一包中,那么父類的default型的成員變量是能夠被子類訪問的。我們來舉個例子:文件名是:Inherite.java

class Person{

  String name;
  protected int age;
}

class Student extends Person{
  String school;
  double score;
}

public class Inherite {
  public static void main (String [] argv ){
    Student S = new Student ();
    S.name = "卓增泗";
    S.school = "交通大學";
    S.age = 24;
    S.score = 95.5;
    System.out.println("我是" + S.name + ",今年" + S.age + "歲,畢業於" + S.school + ",平均成績是:" + S.score);
   }
}

最終的結果是:

         

 

  這個結果說明,子類是可以訪問父類的default型的成員變量的。但是,當它們不在同一包中呢?我們再舉一個例子:文件名1:Person.java  文件名2:Inherite1.java

//文件1:Person.java

package heri;

public class Person {
  String name;
  public int age;
}

這個文件編譯后*.class文件位於heri文件夾中,編譯命令為:javac -d . Person.java

//文件名:Inherite1.java

class Student extends Person{
  String school;
  double score;
}

public class Inherite1 {
  public static void main (String [] argv ) {
    Student S = new Student ();
    S.name = "卓增泗";
    S.school = "交通大學";
    S.age = 24;
    S.score = 95.5;
    System.out.println("我是" + S.name + ",今年" + S.age + "歲,畢業於" + S.school + ",平均成績是:" + S.score);
  }
}

最終結果為:

      

可知,編譯出現了兩個錯誤,即是default型的成員變量。

  那么如何來解釋這一現象呢?前面說過,因為隱私程度default高於protected,所以在同一包中時,子類也是一種類,這樣子類就被視為是同一包中的類,這樣的話子類就具有default的訪問權限了。當不在同一包中時,子類就沒有default的訪問權限了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM