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明确表示此修饰符标记的变量和方法只能从其类中访问。外部类中是否有静态嵌套类?是的,所以没问题!随心所欲地访问它们。