MERHABA! Java yöntemlerini zaten kullanıyorsunuz ve onlar hakkında çok şey biliyorsunuz. Yöntem geçersiz kılma nasıl çalışır - 1Elbette, aynı ada ancak farklı argüman listelerine sahip birçok yöntemi olan bir sınıfla karşılaşmışsınızdır. Bu durumlarda metot aşırı yükleme kullandığımızı hatırlayacaksınız. Bugün farklı bir duruma göz atacağız. Ortak bir yöntemimiz olduğunu, ancak hangi sınıfa çağrıldığına bağlı olarak farklı şeyler yapması gerektiğini düşünün. Bu davranışı nasıl uygularız? Bunu anlamak için hayvanları temsil eden üst sınıfı alıp içinde Animalbir metot oluşturalım :speak

public class Animal {
  
   public void speak() {

       System.out.println("Hello!");
   }
}
Programımızı yazmaya yeni başlamış olmamıza rağmen, muhtemelen potansiyel bir sorun görebilirsiniz: dünya bir sürü hayvanla dolu ve hepsi farklı "konuşuyor": kediler miyavlıyor, ördekler vaklıyor, yılanlar tıslıyor, Yöntem geçersiz kılma nasıl çalışır - 2vs. konuşmak için bir sürü yöntem oluşturmaktan kaçınmak istiyorum. meow()Miyavlama, tıslama vb. için bir yöntem oluşturmak yerine , yöntem çağrıldığında hiss()yılanın tıslamasını, kedinin miyavlamasını ve köpeğin havlamasını istiyoruz . Yöntem geçersiz kılmaspeak() kullanarak bunu kolayca başarabiliriz . Wikipedia terimi şu şekilde açıklar: Yöntem geçersiz kılma, nesne yönelimli programlamada, bir alt sınıfın veya alt sınıfın, üst sınıflarından veya üst sınıflarından biri tarafından zaten sağlanan bir yöntemin belirli bir uygulamasını sağlamasına izin veren bir dil özelliğidir. Bu temelde doğru. Geçersiz kılma, bir üst sınıfın bazı yöntemlerini almanıza ve türetilmiş her sınıfa kendi uygulamanızı yazmanıza olanak tanır. Alt sınıftaki yeni uygulama, üst sınıftakinin yerini alır. Bunun nasıl göründüğünü bir örnekle görelim. Sınıfımızın 4 soyunu oluşturalım Animal:

public class Bear extends Animal {
   @Override
   public void speak() {
       System.out.println("Growl!");
   }
}
public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}


public class Snake extends Animal {

   @Override
   public void speak() {
       System.out.println("Hiss!");
   }
}
İşte gelecek için küçük bir yaşam tüyosu: bir üst sınıfın yöntemlerini geçersiz kılmak için IntelliJ IDE'de türetilmiş sınıfın koduna gidin, Ctrl +O tuşlarına basın ve menüden Yöntemleri geçersiz kıl... öğesini seçin. En başından kısayol tuşlarını kullanmaya alışın. Kodlamayı hızlandıracaklar! İstenen davranışı elde etmek için birkaç şey yaptık:
  1. Her alt sınıfta, üst sınıftaki yöntemle aynı ada sahip bir yöntem oluşturduk.
  2. Derleyiciye, yönteme yalnızca üst sınıftakiyle aynı adı vermediğimizi, bunun yerine davranışını geçersiz kılmak istediğimizi söyledik. Derleyiciye gönderilen bu "mesaj", @Override ek açıklaması aracılığıyla iletilir.
    Bir yöntemin üzerindeki @Override ek açıklaması, derleyiciye (diğer programcıların da kodunuzu okumasıyla birlikte) "Endişelenmeyin. Bu bir hata veya gözden kaçırma değil. Bu yöntemin zaten var olduğunun farkındayım ve onu geçersiz kılmak istiyorum" der. .

  3. Her bir alt sınıf için ihtiyacımız olan uygulamayı yazdık. Yöntem speak()çağrıldığında yılan tıslamalı, ayı hırlamalı vb.
Bunun bir programda nasıl çalıştığını görelim:

public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();
      
       animal1.speak();
       animal2.speak();
       animal3.speak();
       animal4.speak();
   }
}
Konsol çıktısı:

Woof! 
Meow! 
Growl! 
Hiss!
Harika, her şey olması gerektiği gibi çalışıyor! Türü üst sınıf olan 4 referans değişkeni yarattık Animalve onlara alt sınıfların 4 farklı nesnesini atadık. Sonuç olarak, her nesne farklı davranır. Türetilmiş sınıfların her biri için geçersiz kılınan yöntem, sınıfın speak()mevcut yönteminin yerini alır (konsolda yalnızca "Speaking: " görüntülenir). Yöntem geçersiz kılmanın birkaç sınırlaması vardır: speak()AnimalYöntem geçersiz kılma nasıl çalışır - 3
  1. Geçersiz kılınan bir yöntem, üst sınıftaki yöntemle aynı bağımsız değişkenlere sahip olmalıdır.

    speakÜst sınıfın yöntemi girdi olarak a alıyorsa , Stringalt sınıftaki geçersiz kılınan yöntem de Stringgirdi olarak a almalıdır. Aksi takdirde, derleyici bir hata üretecektir:

    
    public class Animal {
    
       public void speak(String s) {
    
           System.out.println("Speaking: " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override // Error!
       public void speak() {
           System.out.println("Meow!");
       }
    }
    

  2. Geçersiz kılınan yöntem, üst sınıftaki yöntemle aynı dönüş türüne sahip olmalıdır.

    Aksi takdirde, bir derleme hatası alırız:

    
    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String speak() {         // Error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }
    

  3. Geçersiz kılınan yöntemin erişim değiştiricisi de orijinal olandan farklı olamaz:

    
    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    public class Cat extends Animal {
    
       @Override
       private void speak() {      // Error!
           System.out.println("Meow!");
       }
    }
    
Java'da, yöntem geçersiz kılma, polimorfizmi uygulamanın bir yoludur. Bu, ana avantajının daha önce bahsettiğimiz esneklik olduğu anlamına gelir. Her biri belirli davranışlara sahip (havlayan köpekler, miyavlayan kediler) ancak tek bir arayüze sahip basit ve mantıklı bir sınıf hiyerarşisi oluşturabiliriz - speak()bir grup farklı yöntem yerine herkes için tek bir yöntem, örneğin bark(), meow(), vb.