1.內部類
您最近了解到有靜態變量和靜態方法。原來還有靜態類。但我們將從遠處來探討這個話題。
在 Java 中,您完全可以在類中聲明類。甚至類中的類中的類中的類中的類。這一切看起來都很簡單:
class OuterClass
{
variables of the class
methods of the class
class NestedClass
{
variables of the class
methods of the class
}
}
我們只是在另一個類中聲明一個類。就如此容易。
例子:
public class Solution
{
static ArrayList<Point> points = new ArrayList<Point>();
public static void main(String[] args)
{
Point point = new Point();
point.x = 100;
point.y = 200;
points.add(point);
}
static class Point
{
int x;
int y;
}
}
嵌套類可以是靜態的或非靜態的。靜態嵌套類簡稱靜態嵌套類。非靜態嵌套類稱為內部類(inner classes)。
2.靜態類
靜態嵌套類可以在其外部類之外使用。如果這樣的類具有 public 訪問修飾符,那麼它可以在程序的任何地方使用。這樣的類與任何普通類幾乎沒有區別。但是有一些不同之處。
班級名稱
如果要從外部類以外的地方引用靜態嵌套類,則需要指定類名,它由外部類的名稱和嵌套類的名稱組成。這是這個名字的一般外觀:
OuterClass.InnerClass
例子:
外層類 | 嵌套類 | 嵌套類的全名 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
如果嵌套類有自己的嵌套類,則它們的名稱只需使用點連接即可。
JDK 中嵌套類的一個典型例子是Entry
class inside of Map
class。如果要獲取存儲在對像中的鍵值對集HashMap
,請使用entrySet()
方法,該方法返回一個.Set<Map.Entry>
請注意,這是外部類和嵌套類的示例。Map.Entry
創建對象
創建靜態嵌套類的對象非常容易。這是它的樣子:
OuterClass.NestedClass name = new OuterClass.NestedClass();
它與普通類完全相同,但名稱由兩部分組成。
調用靜態方法
如果一個靜態類有靜態方法,你可以像訪問普通類的靜態方法一樣訪問它們(但是類名會由兩部分組成)。
OuterClass.NestedClass.staticMethod();
訪問靜態變量
訪問嵌套類的公共靜態變量也很容易:
OuterParent.NestedClass.nameOfStaticVariable
3.靜態類的特點
靜態嵌套類被稱為靜態的理由最少。他們的行為就像普通班級一樣。從非靜態方法訪問它們沒有限制。
如果您在其外部類中使用靜態嵌套類,您將不會注意到與最普通(非嵌套且非靜態)類的任何區別。
例子:
靜態嵌套點類 | 普通點類。 |
---|---|
|
|
如果將某個靜態嵌套類從其外部類中移出,唯一會發生變化的是新類將不再能夠訪問private static
其先前外部類的變量和方法。
例子:
靜態嵌套點類 | 普通點類。 |
---|---|
|
|
main
普通Point
類中的方法不能訪問類private static
points
的變量Solution
!
這是靜態嵌套類和普通類的主要區別。靜態嵌套類的方法可以訪問其外部類的所有靜態變量和方法,即使它們是聲明的private
。
如果您考慮一下,為什麼會感到驚訝呢?修飾符private
明確表示此修飾符標記的變量和方法只能從其類中訪問。外部類中是否有靜態嵌套類?是的,所以沒問題!隨心所欲地訪問它們。