CodeGym /Java Blogu /Rastgele /Java'da Instanceof ve Inheritance
John Squirrels
Seviye
San Francisco

Java'da Instanceof ve Inheritance

grupta yayınlandı
MERHABA! Önceki derslerde, kalıtım kavramıyla kısaca tanışmıştık. Bugün bu konuya tekrar değineceğiz, ama yine çok derinlemesine değil. Gelecekte bununla ilgili daha ayrıntılı bir dersimiz olacak. Bugün birkaç pratik örneğe hızlıca göz atacağız ve Java'daki ilginç bir operatörle tanışacağız.

Miras

Peki miras nedir? instanceof ve Kalıtım 101 - 1 Kalıtım, mevcut bir sınıfa dayalı olarak yeni bir sınıf bildirmenizi sağlayan bir programlama mekanizmasıdır (Java dahil). Türetilmiş sınıf daha sonra üst sınıfın alanlarına ve yöntemlerine erişim kazanır. Buna neden ihtiyacımız olsun ki? Pekala, bir programda birkaç araba sınıfı oluşturmanız gerektiğini hayal edin: Kamyon, Yarış Arabası, Sedan, Kamyonet, vb. isim, üretim yılı, motor boyutu, maksimum hız vb. (hepsinin ortak tekerlekleri ve diğer parçaları olduğu gerçeğinden bahsetmiyorum bile). Bu durumda şunları yapabilirsiniz:
  • Bu alanları her sınıfta oluşturun (oluşturduğunuz her yeni araba sınıfına ekleyin)
  • Tüm arabalar için ortak olan alanları bir Carüst sınıfa getirin ve ardından, sınıftan belirli araba türleri için tüm sınıfları türetmek üzere extendsCar anahtar sözcüğünü kullanın .
Doğal olarak, ikinci seçenek çok daha uygundur:

public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
En azından, gereksiz kod tekrarından kaçınırız (ve program yazarken her zaman bunun için çabalamalıyız). Ayrıca, tüm arabalarda ortak olan tüm alanların tek bir sınıfta toplandığı basit ve anlaşılır bir sınıf yapımız var. Kamyonların diğer arabalarda olmayan özel alanları varsa, bunlar sınıfta bildirilebilir Truck. Aynı şey yöntemler için de geçerli. CarTüm arabaların , yöntemlerle tanımlanabilecek belirli ortak davranışları vardır, örneğin arabayı çalıştırma, hızlanma/frenleme vb. .

public class Car {

   public void gas() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {
      
       // Only race cars make pit stops
   }

   public static void main(String[] args) {
      
       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Tüm arabalarda ortak olan metotları sınıfa ekledik Car. Ancak F1Car"Formula 1" yarış arabalarını temsil eden sınıfa bakın. Pit stoplar (acil araç bakımı için duruşlar) yalnızca yarışlarda yapılır, bu nedenle ilgili türetilmiş sınıfa bu özel işlevi ekledik. instanceof ve Kalıtım 101 - 2

operatör örneği

Java'da, bir nesnenin belirli bir sınıfa dayalı olarak yaratılıp yaratılmadığını kontrol etmek için özel bir operatör, instanceof vardır . Kontrol sonucuna göre true veya false döndürür . Araba örneğimizdeki sınıfları kullanarak nasıl çalıştığını görelim:

public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
Çıktı: true Operatör , bir nesnemiz olduğu ve tüm kamyonlar araba olduğu için trueinstanceof değerini döndürür . Sınıf , sınıftan türetilmiştir . Tüm kamyonlar, ortak ebeveyn olan sınıfa göre oluşturulur . Operatörün nasıl kullanıldığına yakından bakın . Bu bir yöntem ("object instanceof Class") değil, bir operatör olduğu için nokta koymadan yazarsınız. Başka bir yol deneyelim: TruckTruckCarCarinstanceof

public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
Çıktı: false Sınıf Car(ve araba nesneleri) sınıftan türetilmez Truck. Tüm kamyonlar arabadır, ancak tüm arabalar kamyon değildir. Carnesneler sınıfa dayalı değildir Truck. Bir örnek daha:

public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
Çıktı: Doğru Buradaki mantık da basittir: Java'daki tüm sınıflar, oluşturduğunuz sınıflar dahil, sınıftan türer Object("extends Object" yazmasanız bile—bu zaten ima edilmiştir). Bu nasıl ve ne zaman yararlı olur? Operatör instanceofen yaygın olarak yöntemi geçersiz kılarken kullanılır equals(). Örneğin, yöntemin sınıfta nasıl equalsuygulandığı aşağıda açıklanmıştır String:

public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
a'yı geçirilen nesneyle karşılaştırmadan önce String, yöntem nesnenin bir dize olup olmadığını test eder. Ancak o zaman iki nesnenin özelliklerini karşılaştırmaya başlar. Bu test olmasaydı, değer ve uzunluk alanlarına sahip herhangi bir nesne yönteme geçirilebilir ve bir String ile karşılaştırılabilirdi ki bu elbette yanlış olur.
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION