1. Kelas dalam

Anda baru saja mengetahui bahwa ada variabel statis dan metode statis. Ternyata ada juga kelas statis. Tapi kami akan mendekati topik ini dari jauh.

Di Java, Anda sepenuhnya diizinkan untuk mendeklarasikan kelas di dalam kelas. Dan bahkan kelas di dalam kelas yang ada di dalam kelas di dalam kelas. Semuanya terlihat sangat sederhana:

class OuterClass
{
   variables of the class
   methods of the class

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

Kami hanya mendeklarasikan satu kelas di dalam yang lain. Sesimpel 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 bisa statis atau non-statis. Kelas bersarang statis disebut kelas bersarang statis . Kelas bersarang non-statis disebut kelas dalam ( inner class ).



2. Kelas statis

Kelas bersarang statis dapat digunakan di luar kelas luarnya. Jika kelas tersebut memiliki pengubah akses publik, maka kelas tersebut dapat digunakan di mana saja dalam program. Kelas seperti itu hampir tidak dapat dibedakan dari kelas biasa mana pun. Tetapi ada beberapa perbedaan.

Nama kelas

Jika Anda ingin merujuk ke kelas bersarang statis dari tempat lain selain kelas luarnya, Anda perlu menentukan nama kelas, yang terdiri dari nama kelas luar dan nama kelas bersarang. Inilah tampilan umum dari nama ini:

OuterClass.InnerClass

Contoh:

Kelas luar Kelas bersarang Nama lengkap 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 memiliki kelas bersarangnya sendiri, namanya hanya digabungkan menggunakan titik.

Contoh tipikal kelas bersarang di JDK adalah Entrykelas di dalam Mapkelas. Jika Anda ingin mendapatkan kumpulan pasangan nilai kunci yang disimpan dalam HashMapobjek, gunakan entrySet()metode, yang mengembalikan a .Set<Map.Entry>

Perhatikan bahwa adalah contoh kelas luar dan kelas bersarang.Map.Entry

Membuat objek

Sangat mudah untuk membuat objek dari kelas bersarang statis. Begini tampilannya:

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

Semuanya sama dengan kelas biasa, tetapi namanya terdiri dari dua bagian.

Memanggil metode statis

Jika kelas statis memiliki metode statis, Anda dapat mengaksesnya dengan cara yang sama seperti metode statis kelas biasa (namun nama kelas akan terdiri dari dua bagian).

OuterClass.NestedClass.staticMethod();

Mengakses variabel statis

Mengakses variabel statis publik dari kelas bersarang juga mudah:

OuterParent.NestedClass.nameOfStaticVariable


3. Fitur kelas statis

Kelas bersarang statis memiliki alasan paling sedikit untuk disebut statis. Mereka berperilaku seperti kelas reguler . Tidak ada batasan untuk mengaksesnya dari metode non-statis.

Jika Anda bekerja dengan kelas bersarang statis di dalam kelas luarnya, Anda tidak akan melihat perbedaan apa pun dari kelas paling biasa (tidak bersarang dan tidak statis).

Contoh:

Kelas Titik bersarang statis Kelas Poin 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 statis dan memindahkannya dari kelas luarnya, satu-satunya hal yang akan berubah adalah bahwa kelas baru tidak lagi dapat mengakses private staticvariabel dan metode dari kelas luar sebelumnya.

Contoh:

Kelas Titik bersarang statis Kelas Poin 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);
   }
}

Metode di kelas mainbiasa tidak dapat mengakses variabel kelas !Pointprivate static pointsSolution

Ini adalah perbedaan utama antara kelas bersarang statis dan kelas biasa. Metode kelas bersarang statis dapat mengakses semua variabel statis dan metode kelas luarnya, bahkan jika dideklarasikan private.

Dan jika Anda memikirkannya, mengapa itu mengejutkan? Pengubah privatesecara eksplisit mengatakan bahwa variabel dan metode yang ditandai oleh pengubah ini hanya dapat diakses dari dalam kelasnya. Apakah kelas bersarang statis di dalam kelas luarnya? Ya, jadi tidak masalah! Akses sebanyak yang Anda mau.