Java - Geçersiz Kılma

Önceki bölümde, üst sınıflar ve alt sınıflar hakkında konuştuk. Bir sınıf, üst sınıfından bir yöntemi miras alırsa, son olarak işaretlenmemiş olması koşuluyla yöntemi geçersiz kılma şansı vardır.

Geçersiz kılmanın faydası şudur: alt sınıf türüne özgü bir davranış tanımlama yeteneği, yani bir alt sınıf, gereksinimine göre bir ana sınıf yöntemi uygulayabilir.

Nesneye yönelik terimlerle, geçersiz kılma, mevcut bir yöntemin işlevselliğini geçersiz kılmak anlamına gelir.

Misal

Bir örneğe bakalım.

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
   }
}

Bu, aşağıdaki sonucu verecektir -

Çıktı

Animals can move
Dogs can walk and run

Yukarıdaki örnekte şunu görebilirsiniz: bDog sınıfında hareket yöntemini çalıştıran bir Animal türüdür. Bunun nedeni şudur: Derleme zamanında, kontrol referans türünde yapılır. Bununla birlikte, çalışma zamanında, JVM nesne türünü belirler ve bu belirli nesneye ait olan yöntemi çalıştırır.

Bu nedenle, yukarıdaki örnekte, Animal sınıfının yöntemi hareket ettiği için program düzgün bir şekilde derlenecektir. Daha sonra çalışma zamanında, o nesneye özgü yöntemi çalıştırır.

Aşağıdaki örneği düşünün -

Misal

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      System.out.println("Dogs can walk and run");
   }
   public void bark() {
      System.out.println("Dogs can bark");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal a = new Animal();   // Animal reference and object
      Animal b = new Dog();   // Animal reference but Dog object

      a.move();   // runs the method in Animal class
      b.move();   // runs the method in Dog class
      b.bark();
   }
}

Bu, aşağıdaki sonucu verecektir -

Çıktı

TestDog.java:26: error: cannot find symbol
      b.bark();
       ^
  symbol:   method bark()
  location: variable b of type Animal
1 error

Bu program, b'nin referans türü Animal'in bark adına göre bir metoda sahip olmadığı için bir derleme zamanı hatası atacaktır.

Yöntemi Geçersiz Kılma Kuralları

  • Argüman listesi, geçersiz kılınan yöntemle tamamen aynı olmalıdır.

  • Dönüş türü, üst sınıftaki orijinal geçersiz kılınan yöntemde bildirilen dönüş türünün aynısı veya alt türü olmalıdır.

  • Erişim düzeyi, geçersiz kılınan yöntemin erişim düzeyinden daha kısıtlayıcı olamaz. Örneğin: Üst sınıf yöntemi genel olarak bildirilirse, alt sınıftaki geçersiz kılma yöntemi özel veya korumalı olamaz.

  • Örnek yöntemleri, yalnızca alt sınıf tarafından miras alınmışlarsa geçersiz kılınabilir.

  • Son olarak belirtilen bir yöntem geçersiz kılınamaz.

  • Statik olarak bildirilen bir yöntem geçersiz kılınamaz, ancak yeniden bildirilebilir.

  • Bir yöntem miras alınamıyorsa, geçersiz kılınamaz.

  • Örneğin üst sınıfıyla aynı pakette bulunan bir alt sınıf, özel veya nihai olarak bildirilmemiş herhangi bir üst sınıf yöntemini geçersiz kılabilir.

  • Farklı bir paketteki bir alt sınıf, yalnızca genel veya korumalı olarak ilan edilen nihai olmayan yöntemleri geçersiz kılabilir.

  • Geçersiz kılınan bir yöntem, geçersiz kılınan yöntemin istisnalar atıp atmadığına bakılmaksızın, herhangi bir onaysız istisna atabilir. Ancak, geçersiz kılma yöntemi, geçersiz kılınan yöntem tarafından bildirilenlerden yeni veya daha geniş olan kontrol edilmiş istisnaları atmamalıdır. Geçersiz kılma yöntemi, geçersiz kılınan yönteme göre daha dar veya daha az istisna atabilir.

  • Oluşturucular geçersiz kılınamaz.

Süper Anahtar Kelimeyi kullanma

Geçersiz kılınmış bir yöntemin bir üst sınıf sürümünü çağırırken, super anahtar kelime kullanılır.

Misal

class Animal {
   public void move() {
      System.out.println("Animals can move");
   }
}

class Dog extends Animal {
   public void move() {
      super.move();   // invokes the super class method
      System.out.println("Dogs can walk and run");
   }
}

public class TestDog {

   public static void main(String args[]) {
      Animal b = new Dog();   // Animal reference but Dog object
      b.move();   // runs the method in Dog class
   }
}

Bu, aşağıdaki sonucu verecektir -

Çıktı

Animals can move
Dogs can walk and run