Bir alt sınıf, üst sınıfında zaten tanımlanmış olan bir yöntem için özel bir uygulama sağladığında buna yöntem geçersiz kılma adı verilir. Alt sınıftaki geçersiz kılınan yöntem, üst sınıftaki yöntemle aynı ad parametrelerine ve dönüş türüne sahip olmalıdır.
Yöntemi Geçersiz Kılma Kuralları
- Ad parametreleri ve dönüş türü ana yöntemle eşleşmelidir.
- Java, yalnızca referans değişken türüne değil, gerçek nesne türüne göre çalışma zamanında hangi yöntemin çalıştırılacağını seçer.
- Statik yöntemler geçersiz kılınamaz.
- @Ek açıklamayı geçersiz kıl yöntem adlarındaki yazım hataları gibi hataları yakalar.
class Animal { void move(){ System.out.println( 'Animal is moving.'); } void eat(){ System.out.println( 'Animal is eating.'); } } class Dog extends Animal{ @Override void move(){ // move method from Base class is overriden in this // method System.out.println('Dog is running.'); } void bark(){ System.out.println('Dog is barking.'); } } public class Geeks { public static void main(String[] args) { Dog d = new Dog(); d.move(); d.eat(); d.bark(); } }
Çıkış
Dog is running. Animal is eating. Dog is barking.
Açıklama: Animal sınıfı aşağıdaki gibi temel işlevleri tanımlar: taşınmak() Ve yemek yemek() . Dog sınıfı Animal'dan miras alır ve geçersiz kılmalar belirli bir davranış sağlamak için move() yöntemi Köpek koşuyor. Her iki sınıf da kendi yöntemlerine erişebilir. Bir Dog nesnesi oluştururken move() çağrısı geçersiz kılınan yöntemi çalıştırır.

Geçersiz Kılmada Özel Durumlar
1. Super Kullanarak Ebeveyn Yöntemini Çağırmak
süper anahtar kelime geçersiz kılma yönteminden üst sınıf yöntemini çağırabilir.
Javaclass Parent{ void show(){ System.out.println('Parent's show()'); } } class Child extends Parent{ @Override void show(){ super.show(); System.out.println('Child's show()'); } } public class Main{ public static void main(String[] args){ Parent obj = new Child(); obj.show(); } }
Çıkış
Parent's show() Child's show()
2. Nihai Yöntemler Geçersiz Kılılamaz
Bir yöntemin geçersiz kılınmasını istemiyorsak, onu şu şekilde bildiririz: son . Lütfen bakın Final'i Kalıtımla Kullanmak .
Javaclass Parent{ // Can't be overridden final void show(){ } } class Child extends Parent{ // This would produce error void show() {} }
Çıkış :

3. Statik Yöntemler
- Statik yöntemler geçersiz kılınamaz; Bir alt sınıfta, üst sınıftakiyle aynı imzaya sahip statik bir yöntem tanımlamak, üst sınıf yöntemini gizler.
- Örnek yöntemleri geçersiz kılınabilir ancak bir alt sınıf, bir üst sınıf statik yöntemini geçersiz kılamaz.
- Bir alt sınıftaki bir üst sınıf statik yöntemiyle aynı imzaya sahip bir statik yöntem, orijinal yöntemi gizler.
class Parent{ static void staticMethod(){ System.out.println('Parent static method'); } void instanceMethod(){ System.out.println('Parent instance method'); } } class Child extends Parent{ static void staticMethod(){ // Hides Parent's static method System.out.println('Child static method'); } @Override void instanceMethod(){ // Overrides Parent's instance method System.out.println('Child instance method'); } } public class GFG{ public static void main(String[] args){ Parent p = new Child(); // Calls Parent's static method (hiding) p.staticMethod(); // Calls Child's overridden instance method p.instanceMethod(); } }
Çıkış
Parent static method Child instance method
4. Özel Yöntemler
- Özel yöntemler, alt sınıflar tarafından görülemediğinden geçersiz kılınamaz.
- Aynı ada sahip bir alt sınıf yöntemi, üst sınıfla ilgisi olmayan yeni ve bağımsız bir yöntem olarak değerlendirilir.
class Parent{ private void display(){ System.out.println('Parent private method'); } } class Child extends Parent{ void display(){ // This is a new method not overriding System.out.println('Child method'); } } public class GFG{ public static void main(String[] args){ Child c = new Child(); // Calls Child's method c.display(); } }
Çıkış
Child method
5. Kovaryant Getiri Türleri
- Geçersiz kılma yönteminde geçersiz kılma yönteminin dönüş tipi, geçersiz kılınan yöntemin dönüş tipinin bir alt sınıfı olabilir.
- Bu özellik, ortak değişken dönüş türü olarak bilinir ve alt sınıfta daha spesifik dönüş türlerine izin verir.
class Parent{ Parent getObject(){ System.out.println('Parent object'); return new Parent(); } } class Child extends Parent{ @Override // Covariant return type Child getObject() { System.out.println('Child object'); return new Child(); } } public class GFG{ public static void main(String[] args){ Parent obj = new Child(); // Calls Child's method obj.getObject(); } }
Çıkış
Child object
Geçersiz Kılmada İstisna İşleme
- Geçersiz kılma yöntemi, üst sınıftaki yöntemden daha yeni veya daha geniş işaretli istisnalar oluşturamaz.
- Daha az veya daha dar kontrol edilen istisnalar oluşturabilir.
- Üst sınıf yöntemine bakılmaksızın denetlenmeyen istisnaları (RuntimeException gibi) atabilir.
import java.io.IOException; class Parent { void display() throws IOException { System.out.println('Parent method'); } } class Child extends Parent { @Override void display() throws IOException { System.out.println('Child method'); } } public class GFG{ public static void main(String[] args){ // Parent reference Child object Parent obj = new Child(); try{ // Calls Child's overridden method obj.display(); } catch (IOException e){ System.out.println('Exception caught: ' + e.getMessage()); } } }
Çıkış
Child method
Yöntem Geçersiz Kılmayı Neden Kullanıyoruz?
- Bir alt sınıfta mevcut bir yöntemin davranışını değiştirmek veya geliştirmek.
- Çalışma zamanı polimorfizmini elde etmek için yöntem çağrıları gerçek nesne türüne bağlıdır.
- Artıklığı mantıksal olarak azaltan yöntem adlarını yeniden kullanmak.
Gerçek Hayattan Örnek: Çalışan Yönetim Sistemi
Gerçek dünyadan bir benzetmeyle geçersiz kılmayı anlayalım.
Bir kuruluşun Çalışan Yönetim Sistemini hayal edin. Tüm çalışanlar, RaiseSalary() ve Promotion() gibi bazı davranışları paylaşır ancak mantık, Yönetici veya Mühendis gibi farklı roller için farklılık gösterir. Bireysel çalışanların farklı türde olduğu (satış teknolojisi vb.) tek bir Çalışan dizisi oluşturabilir ve işlevlerini çağırabiliriz. Bu, genel kodu büyük ölçüde basitleştirir.
Javaabstract class Employee { abstract void raiseSalary(); abstract void promote(); } class Manager extends Employee{ @Override void raiseSalary(){ System.out.println( 'Manager salary raised with incentives.'); } @Override void promote(){ System.out.println( 'Manager promoted to Senior Manager.'); } } class Engineer extends Employee{ @Override void raiseSalary(){ System.out.println( 'Engineer salary raised with bonus.'); } @Override void promote(){ System.out.println( 'Engineer promoted to Senior Engineer.'); } } public class Company{ public static void main(String[] args){ Employee[] employees = { new Manager() new Engineer() }; System.out.println('--- Raising Salaries ---'); for (Employee e : employees){ e.raiseSalary(); } System.out.println('n--- Promotions ---'); for (Employee e : employees) { e.promote(); } } }
Çıkış
--- Raising Salaries --- Manager salary raised with incentives. Engineer salary raised with bonus. --- Promotions --- Manager promoted to Senior Manager. Engineer promoted to Senior Engineer.
Açıklama: Her ne kadar Yönetici ve Mühendis nesnelerine Çalışan türü kullanılarak başvurulsa da Java, çalışma zamanında gerçek nesnelerin geçersiz kılınan yöntemlerini çağırır ve dinamik yöntem gönderimini (çalışma zamanı polimorfizmi) gösterir.
İlgili Makale: Yöntemin Aşırı Yüklenmesi ve Yöntemin Geçersiz Kılması