1. İç sınıflar

Son zamanlarda statik değişkenler ve statik yöntemler olduğunu öğrendiniz. Statik sınıfların da olduğu ortaya çıktı. Ama biz bu konuya uzaktan yaklaşacağız.

Java'da, sınıflar içinde sınıflar bildirmenize tamamen izin verilir. Ve hatta sınıflar içinde sınıflar içinde olan sınıflar içinde sınıflar. Her şey çok basit görünüyor:

class OuterClass
{
   variables of the class
   methods of the class

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

Sadece bir sınıfı diğerinin içinde ilan ediyoruz. Kadar basit.

Örnek:

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

Yuvalanmış sınıflar statik olabilir veya statik olmayabilir. Statik iç içe sınıflara basitçe statik iç içe sınıflar denir . Statik olmayan yuvalanmış sınıflara iç sınıflar ( iç sınıflar ) denir .



2. Statik sınıflar

Statik iç içe sınıflar, dış sınıflarının dışında kullanılabilir. Böyle bir sınıf, genel erişim değiştiricisine sahipse, programın herhangi bir yerinde kullanılabilir. Bu tür sınıflar, herhangi bir sıradan sınıftan neredeyse ayırt edilemez. Ama bir iki fark var.

Sınıf adı

Statik iç içe geçmiş bir sınıfa, dış sınıfı dışında bir yerden başvurmak istiyorsanız, dış sınıfın adı ve iç içe sınıfın adından oluşan sınıf adını belirtmeniz gerekir. İşte bu ismin genel görünümü:

OuterClass.InnerClass

Örnekler:

Dış sınıf İç içe sınıf Yuvalanmış sınıfın tam adı
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

İç içe geçmiş bir sınıfın kendi iç içe sınıfı varsa, adları basitçe bir nokta kullanılarak birleştirilir.

JDK'daki iç içe sınıfların tipik bir örneği, sınıfın Entryiçindeki sınıftır Map. Bir nesnede depolanan anahtar/değer çiftleri kümesini almak istiyorsanız , a döndüren yöntemi HashMapkullanın .entrySet()Set<Map.Entry>

Bunun bir dış sınıf ve iç içe geçmiş bir sınıf örneği olduğuna dikkat edin.Map.Entry

nesne oluşturma

Statik iç içe bir sınıfın nesnesini oluşturmak çok kolaydır. İşte böyle görünüyor:

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

Her şey normal sınıflarla aynıdır, ancak ad iki bölümden oluşur.

Statik yöntemleri çağırma

Bir statik sınıfın statik yöntemleri varsa, bunlara sıradan sınıfların statik yöntemleriyle aynı şekilde erişebilirsiniz (ancak sınıf adı iki bölümden oluşacaktır).

OuterClass.NestedClass.staticMethod();

Statik değişkenlere erişme

Yuvalanmış bir sınıfın genel statik değişkenlerine erişmek de kolaydır:

OuterParent.NestedClass.nameOfStaticVariable


3. Statik sınıfların özellikleri

Statik iç içe geçmiş sınıflar, statik olarak adlandırılmak için en az nedene sahiptir. Normal sınıflar gibi davranırlar . Statik olmayan yöntemlerden bunlara erişimde herhangi bir kısıtlama yoktur.

Dış sınıfı içinde statik iç içe geçmiş bir sınıfla çalışıyorsanız, en sıradan (iç içe ve statik olmayan) sınıftan herhangi bir fark görmezsiniz.

Örnek:

Statik iç içe Point sınıfı Sıradan Puan sınıfı.
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;
}

Bazı statik iç içe sınıfları alıp dış sınıfın dışına taşırsanız, değişecek olan tek şey, yeni sınıfın artık eski dış sınıfının değişkenlerine ve yöntemlerine erişemeyeceğidir .private static

Örnek:

Statik iç içe Point sınıfı Sıradan Puan sınıfı.
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);
   }
}

mainSıradan sınıftaki Pointyöntem , sınıfın değişkenine erişemez !private static pointsSolution

Statik iç içe geçmiş bir sınıf ile sıradan bir sınıf arasındaki temel fark budur. Statik iç içe sınıfın yöntemleri, dış sınıflarının tüm statik değişkenlerine ve yöntemlerine, bildirilmiş olsalar bile erişebilir private.

Ve eğer düşünürseniz, bu neden şaşırtıcı olsun ki? Değiştirici private, bu değiştirici tarafından işaretlenen değişkenlere ve yöntemlere yalnızca kendi sınıflarından erişilebileceğini açıkça söyler. Statik iç içe geçmiş bir sınıf, dış sınıfının içinde mi? Evet, sorun değil! Onlara istediğiniz kadar erişin.