在Java語言中,類的訪問修飾符決定了其它類能夠訪問該類的方式。類有如下4種訪問修飾符,在創建類時用于類的聲明:
1、public:
- 當一個類被聲明為
public
時,它可以從任何其他類中被訪問,無論這些類位于哪個包中。 - 通常,公共類包含公共的靜態方法,這些方法可以被其他任何類調用,以及公共的實例方法,這些方法可以被其他任何類的實例調用。
- 頂層類只能是公開的或者是默認(包級私有)的。
2、protected:
protected
訪問修飾符允許類被其所在包中的其他類以及所有子類訪問,無論子類是在哪個包中。- 這意味著,如果一個類是在包
com.example
中聲明的protected
,那么com.example
包中的任何其他類以及任何繼承自這個類的子類(無論它們在哪個包中)都可以訪問這個類。
3、默認訪問修飾符(無修飾符):
- 當類沒有顯式聲明任何訪問修飾符時,它只能被其所在包中的其他類訪問。
這種訪問級別有時被稱為“包級私有”,因為它限制了類只能在同一個包內部被訪問。
4、private:
- 在Java中,
private
訪問修飾符不能用于頂層類(即非內部類或非嵌套類)。 - 它只能用于類的成員(如字段、方法、內部類等),表示這些成員只能在它們自己的類中被訪問。
下面是一個示例,展示了如何在Java中使用不同的訪問修飾符來聲明類:
// MyClass.java
public class MyClass { // public 類 // 可以在任何地方被訪問
} // AnotherClass.java
class AnotherClass { // 默認訪問修飾符(無修飾符)的類 // 只能在同一個包中被訪問
} // ProtectedClass.java
protected class ProtectedClass { // protected 類 // 可以在同一個包中和所有子類中被訪問
} // InnerClass.java
public class OuterClass { protected class ProtectedInnerClass { // 嵌套類可以是 protected // 可以在同一個包中和所有子類中被訪問 } class DefaultInnerClass { // 默認訪問修飾符的嵌套類 // 只能在同一個包中被訪問 }
}
在Java中,private
訪問修飾符修飾的類不能用于頂層類(即非內部類或非嵌套類)。頂層類總是具有包級私有訪問權限:public,protectded,默認(沒有任何修飾符,也具有包級私有訪問權限)。
作為一個只能作為內部類的私有類,可以被在所在的頂層類中被實例化訪問:
(1)在頂層類的方法中實例化訪問;
(2)在頂層類中其它內部類中訪問。
package com.test;public class OuterClass {/*** 外部類(頂層類)OuterClass* 類中嵌套3個類:分別為私有(private),靜態(static),默認訪問修飾符(無修飾符)的類*/private class PrivateInnerClass {/*** PrivateInnerClass是一個私有內部類,只能在頂層類OuterClass中被訪問:* 1、可以在OuterClass中方法中創建實例訪問* 2、也可以在OuterClass中的內部其他類中的方法中訪問* PrivateInnerClass類也可以訪問頂層類OuterClass中的其它類。*/String name = "PrivateInnerClass.name";public void test() {// 創建內部類DefaultInnerClass的實例DefaultInnerClass a = new DefaultInnerClass();System.out.println("在私有內部類PrivateInnerClass類中調用DefaultInnerClass中屬性name:" + a.name);}}static class StaticNestedClass {// 這是一個靜態嵌套類,可以在任何地方被訪問,因為它具有包級私有訪問權限String name = "StaticNestedClass.name";}class DefaultInnerClass {// 這是一個默認訪問修飾符的內部類,只能在同一個包中的OuterClass中被訪問String name = "DefaultInnerClass.name";public void test() {StaticNestedClass a = new StaticNestedClass();System.out.println("在內部defalut類DefaultInnerClass中調用內部靜態類StaticNestedClass的屬性name:" +a.name);PrivateInnerClass b = new PrivateInnerClass();System.out.println("在內部defalut類DefaultInnerClass中調用內部私有類PrivateInnerClass的屬性name:" +b.name);}}// 定義print方法public void print(String str) {System.out.println(str);PrivateInnerClass a = new PrivateInnerClass();System.out.println("調用內部私有類PrivateInnerClass中的成員name" + a.name);a.test();StaticNestedClass b = new StaticNestedClass();System.out.println("調用內部靜態類StaticNestedClass中的成員name" + b.name);DefaultInnerClass c = new DefaultInnerClass();System.out.println("調用內部default類DefaultInnerClass中的成員name" + c.name);c.test();}
}
如上代碼驗證運行無誤,另外需要理解的知識點:
對后綴為.java的文件進行編譯,文件中的所有類都將被編譯為一個獨立的后綴為.class文件(java字節碼文件)。
對于一個頂層類中定義了一個或者多個內部類也是如此,但是內部類編譯后的.class類文件名是“頂層類名$私有類名.class"。編譯如上代碼OutClass.java文件,將產生如下幾個文件:
1、頂層類文件:OutClass.class
2、私有類文件:OuterClass$DefaultInnerClass.class,OuterClass$PrivateInnerClass.class,OuterClass$StaticNestedClass.class。
這是Java提供的一個強大特性,即可以在單個文件中組織多個相關的類,同時保持它們在編譯后的獨立性。