CodeGym /Java Blogu /Rastgele /Java'daki soyut sınıfların belirli örnekleri
John Squirrels
Seviye
San Francisco

Java'daki soyut sınıfların belirli örnekleri

grupta yayınlandı
MERHABA! Geçmiş derslerde arayüzlerle tanıştık ve ne işe yaradıklarını çözdük. Bugünün konusu bir öncekinin yankısı olacak. Java'daki soyut sınıflardan bahsedelim .Java'daki soyut sınıfların belirli örnekleri - 1

Sınıflar neden 'soyut' olarak adlandırılır?

Muhtemelen 'soyutlamanın' ne olduğunu hatırlıyorsunuzdur - bunun üzerinden çoktan geçtik. :) Unutursanız korkmayın. Unutmayın: Bu, sınıfları tasarlarken ve nesneler oluştururken, yalnızca varlığın ana özelliklerini tanımlamamız ve küçük olanları atmamız gerektiğini söyleyen bir OOP ilkesidir . Örneğin, bir sınıf tasarlıyorsak , bir " yükseklikSchoolTeacher " özelliğine pek ihtiyacımız olmaz . Aslında, bu özellik bir öğretmen için önemsizdir. Ama eğer bir sınıf yaratıyorsak , büyüme önemli bir özellik olacaktır. O zaman dinle. Soyut bir sınıfBasketballPlayergeldikleri kadar soyut - gelecekteki bir grup ders için tamamlanmamış bir 'boş'. Boşluk olduğu gibi kullanılamaz. Çok "ham". Ancak, soyut sınıfı miras alan gelecekteki sınıfların sahip olacağı belirli durumu ve genel davranışı tanımlar.

Soyut Java sınıflarına örnekler

Arabalarla ilgili basit bir örneği ele alalım:

public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public abstract void gas();

   public abstract void brake();

   public String getModel() {
       return model;
   }

   public void setModel(String model) {
       this.model = model;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getMaxSpeed() {
       return maxSpeed;
   }

   public void setMaxSpeed(int maxSpeed) {
       this.maxSpeed = maxSpeed;
   }
}
En basit soyut sınıf böyle görünüyor. Gördüğünüz gibi özel bir şey değil :) Neden buna ihtiyacımız olsun ki? Her şeyden önce, ihtiyacımız olan varlığımız olan bir arabayı mümkün olan en soyut şekilde anlatıyor. Soyut kelimesini kullanmamızın bir nedeni var . Gerçek dünyada 'soyut arabalar' yoktur. Kamyonlar, yarış arabaları, sedanlar, coupe'ler ve SUV'lar var. Soyut sınıfımız, daha sonra araba sınıfları oluşturmak için kullanacağımız bir 'plan'dır.

public class Sedan extends Car {

   @Override
   public void gas() {
       System.out.println("The sedan is accelerating!");
   }

   @Override
   public void brake() {
       System.out.println("The sedan is slowing down!");
   }

}
Bu, kalıtımla ilgili derslerde bahsettiğimiz şeye çok benziyor. Ama o derslerde Araba dersimiz vardı ve yöntemleri soyut değildi. Ancak bu çözümün, soyut sınıflarda sabitlenen bir dizi dezavantajı vardır. Her şeyden önce, soyut bir sınıf örneği oluşturamazsınız :

public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
Java'nın yaratıcıları bu 'özelliği' özel olarak tasarladı. Bir kez daha hatırlatmak gerekirse: soyut bir sınıf, yalnızca gelecekteki 'normal' sınıflar için bir plandır . Planın kopyalarına ihtiyacınız yok, değil mi? Ve soyut bir sınıfın örneklerini oluşturmuyorsunuz :) Ama sınıf Carsoyut olmasaydı, kolayca örneklerini oluşturabilirdik:

public class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       // Some logic
   }

    public void brake() {
       // Some logic
   }
}


public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Everything is fine. A car is created.
   }
}
Şimdi programımızın bir tür anlaşılmaz arabası var - bu bir kamyon değil, bir yarış arabası değil, bir sedan değil ve ne olduğu tamamen belirsiz. Bu, doğada var olmayan 'soyut araba'dır. Aynı örneği hayvanlar üzerinden de verebiliriz. AnimalSınıfların ( soyut hayvanlar ) olduğunu hayal edin . Ne tür bir hayvan olduğu, hangi familyaya ait olduğu ve hangi özelliklere sahip olduğu belli değil. Programınızda bunu görmek garip olurdu. Doğada 'soyut hayvanlar' yoktur. Sadece köpekler, kediler, tilkiler, köstebekler vb. Soyut sınıflar bizi soyut nesnelerden kurtarır. Bize temel durum ve davranış verirler. Örneğin, tüm arabaların bir modeli , rengi ve maksimum hızı olmalı ve siz degaz ve fren . Bu kadar. Bu genel bir soyut plandır. Daha sonra ihtiyacınız olan sınıfları tasarlarsınız. Not: abstract sınıfındaki iki metot da abstract olarak tanımlanır ve bunların herhangi bir uygulaması yoktur. Sebep aynı: soyut sınıflar, soyut arabalar için varsayılan davranış oluşturmaz. Sadece her arabanın ne yapabilmesi gerektiğini gösteriyorlar. Ancak, varsayılan davranışa ihtiyacınız varsa, yöntemleri soyut bir sınıfta uygulayabilirsiniz. Java bunu yasaklamaz:

public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       System.out.println("Gas!");
   }

   public abstract void brake();

   // Getters and setters
}


public class Sedan extends Car {

   @Override
   public void brake() {
       System.out.println("The sedan is slowing down!");
   }

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
Konsol çıktısı: "Gaz!" Gördüğünüz gibi, soyut sınıfta birinci yöntemi uyguladık, ikinciyi değil. Sonuç olarak, sınıfımızın Sedandavranışı iki bölüme ayrılmıştır: yöntemi çağırırsanız gas(), çağrı soyut üst sınıfa kadar 'yükselir' , ancak sınıftaki yöntemi Cargeçersiz kıldık.Bu çok uygun ve esnek hale geliyor.Ama şimdi sınıfımız o kadar soyut değil mi ? Sonuçta, yöntemlerinin yarısı uygulandı.Bu aslında çok önemli bir özelliktir - yöntemlerinden en az biri soyutsa bir sınıf soyutturbrake()Sedan. İki yöntemden biri veya bin yöntemden en az biri - hiç fark etmez. Hatta tüm yöntemleri uygulayabilir ve hiçbirini soyut bırakabiliriz. O zaman soyut yöntemler olmadan soyut bir sınıf olur. Prensip olarak bu mümkündür ve derleyici hata üretmez, ancak bundan kaçınmak daha iyidir: Soyut kelimesi anlamını kaybeder ve programcı arkadaşlarınız çok şaşırır :/ Aynı zamanda, bir yöntem işaretlenirse abstract kelimesini kullanarak, her alt sınıf onu uygulamalı veya abstract olarak bildirmelidir. Aksi halde derleyici bir hata üretecektir. Tabii ki, her sınıf yalnızca bir soyut sınıfı miras alabilir, bu nedenle kalıtım açısından soyut ve sıradan sınıflar arasında hiçbir fark yoktur. Soyut bir sınıf mı yoksa sıradan bir sınıf mı miras aldığımız önemli değil, yalnızca bir üst sınıf olabilir.

Java neden birden çok sınıf mirasına sahip değil?

Java'nın çoklu kalıtımı olmadığını zaten söyledik, ancak nedenini tam olarak araştırmadık. Şimdi bunu yapmaya çalışalım. Gerçek şu ki, Java'nın çoklu kalıtımı olsaydı, alt sınıflar hangi özel davranışı seçmeleri gerektiğine karar veremezlerdi. İki sınıfımız olduğunu varsayalım — Toasterve NuclearBomb:

public class Toaster {


 public void on() {

       System.out.println("The toaster is on. Toast is being prepared!");
   }

   public void off() {

       System.out.println("The toaster is off!");
   }
}


public class NuclearBomb {

   public void on() {

       System.out.println("Boom!");
   }
}
Gördüğünüz gibi, her ikisinin de bir on()yöntemi var. Bir tost makinesi için, kızartmaya başlar. Bir nükleer bomba için, bir patlama başlatır. Hata: / Şimdi arada bir şey yaratmaya karar verdiğinizi (nedenini sorma!) hayal edin. Ve böylece bir sınıfınız var MysteriousDevice! Bu kod elbette çalışmaz ve biz onu sadece 'ama olabilir' diye örnek olarak veriyoruz:

public class MysteriousDevice extends Toaster, NuclearBomb {

   public static void main(String[] args) {

       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // So what should happen here? Do we get toast or a nuclear apocalypse?
   }
}
Neye sahip olduğumuza bir göz atalım. Gizemli cihaz aynı anda Toaster ve NuclearBomb'u miras alır. Her ikisinin de yöntemleri var on(). Sonuç olarak, yöntemi çağırırsak on(), nesnede hangisinin çağrılması gerektiği açık değildir MysteriousDevice. Nesnenin bilmesine imkan yok. Üstüne üstlük: NuclearBomb'un bir yöntemi yok off(), bu yüzden doğru tahmin edemezsek, cihazı devre dışı bırakmak imkansız olacak. Java'daki soyut sınıfların belirli örnekleri - 2Nesnenin hangi davranışı sergileyeceğini bilmediği bu "karmaşa" nedeniyle, Java'nın yaratıcıları çoklu kalıtımı terk ettiler. Ancak, Java sınıflarının birden çok arabirim uygulayabileceğini hatırlayacaksınız. Bu arada, çalışmalarınızda zaten en az bir soyut sınıfla karşılaştınız!

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
Bu senin eski arkadaşın, sınıf Calendar. Soyut ve birkaç çocuğu var. Bunlardan biri GregorianCalendar. Tarihlerle ilgili derslerde zaten kullandınız. :) Her şey yeterince açık görünüyor. Sadece bir soru var: soyut sınıflar ve arayüzler arasındaki temel fark nedir? Dili bir dille sınırlamak yerine neden ikisini de Java'ya eklediler? Ne de olsa, bu tamamen yeterli olurdu. Bir sonraki derste bunun hakkında konuşacağız ! O zamana kadar :)
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION