CodeGym/Java Blogu/Rastgele/Statik iç içe sınıflar
John Squirrels
Seviye
San Francisco

Statik iç içe sınıflar

grupta yayınlandı
MERHABA! Java'da iç içe sınıflar konusunu keşfetmeye devam ediyoruz. Son alıştırmada, iç sınıflar olarak da bilinen statik olmayan iç içe sınıflardan bahsetmiştik. Statik iç içe sınıflar - 1Bugün başka bir sınıf grubuna geçiyoruz. Statik iç içe sınıfları ele alacağız. Statik iç içe sınıflar - 3Diğer sınıflardan nasıl farklılar? Bu tür bir sınıfı bildirirken, zaten aşina olduğunuz static anahtar sözcüğünü kullanırız:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Statik iç içe sınıflar - 4Boeing737Bu örnekte, bu tip bir uçağı temsil eden dış sınıfa sahibiz . Tek parametreli bir oluşturucuya sahiptir: üretim yılı ( int manufactureYear). Ayrıca bir statik değişken vardır: maksimum yolcu sayısı ( int maxPassengersCount). Aynı modelin tüm düzlemleri için aynı değere sahip olacaktır, bu nedenle sadece bir örneğe ihtiyacımız var. Ek olarak, statik bir iç içe sınıfa sahiptir: Drawing(uçağın mühendislik planlarını temsil eder). Bu sınıfı, uçakla ilgili tüm resmi bilgileri özetlemek için kullanıyoruz. Örneğimizde, basit olması için bu sınıfı üretim yılıyla sınırladık, ancak birçok başka bilgi içerebilir. Statik iç içe sınıflar - 5Geçen derste de söylediğimiz gibi, böyle iç içe bir sınıf oluşturmak, kapsüllemeyi geliştirir ve daha gerçekçi bir soyutlamaya katkıda bulunur. Statik ve statik olmayan iç içe geçmiş sınıflar arasındaki fark nedir? 1. Statik Drawingsınıfın bir nesnesi, dış sınıfın belirli bir örneğine referans depolamaz. Son dersteki bisiklet örneğini hatırlayın:
public class Bicycle {

   private String model;
   private int maxWeight;

   public Bicycle(String model, int maxWeight) {
       this.model = model;
       this.maxWeight = maxWeight;
   }

   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
HandlebarO derste, iç sınıfın her bir örneğinin, bizim için fark edilmeden, dış sınıfın örneğine bir referans ilettiği gerçeğinden bahsetmiştik Bicycle. Dış sınıfın bir örneği olmadan, iç sınıfın bir nesnesi var olamazdı. Statik iç içe geçmiş sınıflar için durum böyle değildir. Statik iç içe sınıfın bir nesnesi tamamen kendi başına var olabilir. Bu bağlamda, statik sınıflar, statik olmayan sınıflardan daha "bağımsızdır". Bilmeniz gereken tek şey, böyle bir nesne oluştururken dış sınıfın adını belirtmeniz gerektiğidir:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
DrawingGeçen derste dersi yaptığımız halde neden sınıfı durağan hale getirdik?Seatsınıf (bisiklet koltuğunu temsil eden) statik değil mi? Geçen sefer olduğu gibi, örneği anlamak için biraz "felsefe" ekleyelim :) Bisiklet koltuğunun aksine, mühendislik çizimi kavramı uçak kavramına katı bir şekilde bağlı değildir. Bisiklet olmadan, ayrı bir bisiklet koltuğu nesnesi çoğu zaman anlamsız olurdu (her zaman olmasa da, geçen derste bundan bahsetmiştik). Bir mühendislik çizimi kavramı kendi başına anlamlıdır. Örneğin, uçak bakımını planlayan mühendisler için faydalı olabilir. Planı yapmak için uçağa gerek yoktur ve herhangi bir yere yerleştirilebilir. Sadece mühendislik çizimi gereklidir. Ayrıca aynı modeldeki tüm uçaklar aynı mühendis çizimine sahip olacağı için bisiklet selesi kadar sıkı bir ilişki yoktur. Bu nedenle, birDrawingnesnenin belirli bir uçak nesnesine referansa ihtiyacı yoktur. 2. Dış sınıfın değişkenlerine ve yöntemlerine farklı erişim. Statik iç içe geçmiş bir sınıf, yalnızca bir dış sınıfın statik alanlarına erişebilir. Örneğimizde, sınıfın , dış sınıfın statik değişkeninin değerini döndüren Drawingbir yöntemi vardır . Ancak, sınıfta değerini döndürecek bir yöntem oluşturamıyoruz . Sonuçta, değişken statik değildir, yani belirli bir . Ve daha önce keşfettiğimiz gibi, statik iç içe sınıflar söz konusu olduğunda, dış sınıfın nesnesi kolaylıkla bulunmayabilir. Dolayısıyla, sınırlama :) Statik bir değişkenin dış sınıfta hangi erişim değiştiricisine sahip olduğu önemli değildir. Öyle olsa bilegetMaxPassengersCount()maxPassengersCountgetManufactureYear()DrawingmanufactureYearmanufactureYearBoeing737private, statik iç içe geçmiş bir sınıfın yine de erişimi olacaktır. Yukarıdakilerin tümü yalnızca statik değişkenlere erişim için değil, aynı zamanda statik yöntemler için de geçerlidir. ÖNEMLİ! Bir iç sınıfın bildiriminde staticanahtar kelime, yalnızca bir nesne oluşturabileceğiniz anlamına gelmez. Nesneleri değişkenlerle karıştırmayın. Statik değişkenlerden bahsediyorsak, evet, tek bir statik sınıf değişkeni örneği vardır, örneğin, maxPassangersCount. Ancak staticiç içe geçmiş bir sınıfa uygulandığında, yalnızca nesnelerinin dış sınıfın nesnelerine referanslar içermediği anlamına gelir. Ve istediğimiz kadar çok nesne yaratabiliriz:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
Yöntemi doğrudan iç içe geçmiş sınıfta bildirdik main()(bunun için özel bir neden yok — yalnızca bunun mümkün olduğunu size bildirmek için) ve 5 Drawingnesne oluşturduk. Dış sınıftan tek bir nesnemiz olmamasına rağmen. Gördüğünüz gibi bu herhangi bir sorun yaratmadı :) Konsol çıktısı:
Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Ve bu dersimizi bitiriyor! Her ihtimale karşı, size Oracle belgelerinde onlar hakkında bölümün bağlantısını bırakacağım . Bir şey hala net değilse, okuyun. Şimdi birkaç görevi çözme zamanım geldi! :)
Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok