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的訪問權限了。