java public,default,protected,private區別


在說明這四個關鍵字之前,我想就class之間的關系做一個簡單的定義:對於繼承自己的class,base class可以認為他們都是自己的子女,而對於和自己一個目錄下的classes,認為都是自己的朋友。

1、 public :對 所有用戶 開放,所有用戶都可直接調用
2、 private :私有。 除了class自己之外,任何人都不可直接使用 ,私有財產神聖不可侵犯嘛,即便是子女,朋友,都不可使用。
3、 protected :對於子女、朋友來說,就是public的,可自由使用,無任何限制;而對於其他的外部class,protected就變成private。( 同一個包中的類,若不在同一個包中,必須為其子孫類才可使用

4、默認: 默認可以稱為friendly,但是java語言中是沒有friendly這個修飾符的 ,這樣稱呼應該是來源於

 

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