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

例子:

外層類 嵌套類 嵌套類的全名
com.codegym.Solution
Point
com.codegym.Solution.Point
java.util.Map
Entry
java.util.Map.Entry
java.util.Files
DirectoryStream
java.util.Files.DirectoryStream
java.nio.WindowsPath
Closeable
java.nio.WindowsPath.Closeable

如果嵌套類有自己的嵌套類,則它們的名稱只需使用點連接即可。

JDK 中嵌套類的一個典型例子是Entryclass inside of Mapclass。如果要獲取存儲在對像中的鍵值對集HashMap,請使用entrySet()方法,該方法返回一個.Set<Map.Entry>

請注意,這是外部類和嵌套類的示例。Map.Entry

創建對象

創建靜態嵌套類的對象非常容易。這是它的樣子:

OuterClass.NestedClass name = new OuterClass.NestedClass();

它與普通類完全相同,但名稱由兩部分組成。

調用靜態方法

如果一個靜態類有靜態方法,你可以像訪問普通類的靜態方法一樣訪問它們(但是類名會由兩部分組成)。

OuterClass.NestedClass.staticMethod();

訪問靜態變量

訪問嵌套類的公共靜態變量也很容易:

OuterParent.NestedClass.nameOfStaticVariable


3.靜態類的特點

靜態嵌套類被稱為靜態的理由最少。他們的行為就像普通班級一樣。從非靜態方法訪問它們沒有限制。

如果您在其外部類中使用靜態嵌套類,您將不會注意到與最普通(非嵌套且非靜態)類的任何區別。

例子:

靜態嵌套點類 普通點類。
public class Solution
{
   static ArrayList<Point> points;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points = new ArrayList<Point>();
      points.add(point);
   }

   static class Point
   {
      int x;
      int y;
   }
}
public class Solution
{
   static ArrayList<Point> points;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;
      points = new ArrayList<Point>();
      points.add(point);
   }
}

class Point
{
   int x;
   int y;
}

如果將某個靜態嵌套類從其外部類中移出,唯一會發生變化的是新類將不再能夠訪問private static其先前外部類的變量和方法。

例子:

靜態嵌套點類 普通點類。
public class Solution
{
   private static ArrayList<Point> points;

   static class Point
   {
      int x;
      int y;

      public static void main(String[] args)
      {
         Point point = new Point();
         point.x = 100;
         point.y = 200;

         // This will work
         points = new ArrayList<Point>();
         points.add(point);
      }
   }
}
public class Solution
{
   private static ArrayList<Point> points;
}

class Point
{
   int x;
   int y;

   public static void main(String[] args)
   {
      Point point = new Point();
      point.x = 100;
      point.y = 200;

      // This will generate an error
      points = new ArrayList<Point>();
      points.add(point);
   }
}

main普通Point類中的方法不能訪問類private static points的變量Solution

這是靜態嵌套類和普通類的主要區別。靜態嵌套類的方法可以訪問其外部類的所有靜態變量和方法,即使它們是聲明的private

如果您考慮一下,為什麼會感到驚訝呢?修飾符private明確表示此修飾符標記的變量和方法只能從其類中訪問。外部類中是否有靜態嵌套類?是的,所以沒問題!隨心所欲地訪問它們。