1. Kelas dalaman

Anda baru-baru ini mengetahui bahawa terdapat pembolehubah statik dan kaedah statik. Ternyata terdapat juga kelas statik. Tetapi kita akan mendekati topik ini dari jauh.

Di Java, anda dibenarkan sepenuhnya untuk mengisytiharkan kelas dalam kelas. Dan juga kelas dalam kelas yang berada dalam kelas dalam kelas. Semuanya kelihatan sangat mudah:

class OuterClass
{
   variables of the class
   methods of the class

   class NestedClass
   {
      variables of the class
      methods of the class
   }
}

Kami hanya mengisytiharkan satu kelas di dalam kelas lain. Semudah itu.

Contoh:

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;
   }
}

Kelas bersarang boleh menjadi statik atau tidak statik. Kelas bersarang statik hanya dipanggil kelas bersarang statik . Kelas bersarang bukan statik dipanggil kelas dalam ( kelas dalam ).



2. Kelas statik

Kelas bersarang statik boleh digunakan di luar kelas luarnya. Jika kelas sedemikian mempunyai pengubah akses awam, maka ia boleh digunakan di mana-mana sahaja dalam program. Kelas sedemikian hampir tidak dapat dibezakan daripada mana-mana kelas biasa. Tetapi terdapat beberapa perbezaan.

Nama kelas

Jika anda ingin merujuk kepada kelas bersarang statik dari suatu tempat selain daripada kelas luarnya, anda perlu menentukan nama kelas, yang terdiri daripada nama kelas luar dan nama kelas bersarang. Berikut ialah rupa umum nama ini:

OuterClass.InnerClass

Contoh:

Kelas luar Kelas bersarang Nama penuh kelas bersarang
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

Jika kelas bersarang mempunyai kelas bersarang sendiri, nama mereka hanya dicantumkan menggunakan titik.

Contoh biasa kelas bersarang dalam JDK ialah Entrykelas di dalam Mapkelas. Jika anda ingin mendapatkan set pasangan nilai kunci yang disimpan dalam HashMapobjek, kemudian gunakan entrySet()kaedah, yang mengembalikan a .Set<Map.Entry>

Perhatikan itu ialah contoh kelas luar dan kelas bersarang.Map.Entry

Mencipta objek

Sangat mudah untuk mencipta objek kelas bersarang statik. Begini rupanya:

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

Semuanya sama seperti kelas biasa, tetapi namanya terdiri daripada dua bahagian.

Memanggil kaedah statik

Jika kelas statik mempunyai kaedah statik, anda boleh mengaksesnya dengan cara yang sama seperti kaedah statik kelas biasa (tetapi nama kelas akan terdiri daripada dua bahagian).

OuterClass.NestedClass.staticMethod();

Mengakses pembolehubah statik

Mengakses pembolehubah statik awam bagi kelas bersarang juga mudah:

OuterParent.NestedClass.nameOfStaticVariable


3. Ciri-ciri kelas statik

Kelas bersarang statik mempunyai sebab paling sedikit untuk dipanggil statik. Mereka berkelakuan seperti kelas biasa . Tiada sekatan untuk mengaksesnya daripada kaedah bukan statik.

Jika anda bekerja dengan kelas bersarang statik di dalam kelas luarnya, anda tidak akan melihat sebarang perbezaan daripada kelas yang paling biasa (tidak bersarang dan bukan statik).

Contoh:

Kelas mata bersarang statik Kelas Mata Biasa.
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;
}

Jika anda mengambil beberapa kelas bersarang statik dan mengalihkannya keluar dari kelas luarnya, satu-satunya perkara yang akan berubah ialah kelas baharu itu tidak lagi dapat mengakses private staticpembolehubah dan kaedah kelas luarnya yang dahulu.

Contoh:

Kelas mata bersarang statik Kelas Mata Biasa.
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);
   }
}

Kaedah dalam kelas mainbiasa tidak boleh mengakses pembolehubah kelas !Pointprivate static pointsSolution

Ini ialah perbezaan utama antara kelas bersarang statik dan kelas biasa. Kaedah kelas bersarang statik boleh mengakses semua pembolehubah statik dan kaedah kelas luarnya, walaupun ia diisytiharkan private.

Dan jika anda memikirkannya, mengapa perlu mengejutkan? Pengubah privatesuai secara eksplisit mengatakan bahawa pembolehubah dan kaedah yang ditandakan oleh pengubah ini hanya boleh diakses dari dalam kelas mereka. Adakah kelas bersarang statik di dalam kelas luarnya? Ya, jadi tiada masalah! Akses mereka sebanyak yang anda mahu.