Overloading&Overriding — Benzerlik ve Farklılıklar
Bir önceki yazımızda Inheritance konusunu ayrıntılı olarak ele aldık ve bu başlık altında Method Overriding işlemini incelemiştik. Method Overriding ve Method Overloading kavramları birbirleri ile karıştırıldığından dolayı bu yazımızda bu iki kavram üzerinde duracağız ve benzerlik/farklılık noktalarını incelemeye çalışacağız. Konunun anlaşılırlığı açısından daha önceki yazılarımızda kullandığımız Sosyal Medya Uygulaması örneğinden daha farklı bir örnek üzerinden ilerleyebiliriz. Öncelikle bir problem belirleyelim :
Matematiksel işlemleri gerçekleştirmek adına kullanılacak bir sınıf tasarlansın. Calculator isimli bu sınıfta kare, dikdörtgen ve üçgen için alan hesaplayan metotlar bulunsun. Ayrıca bu sınıf MathematicalProcesses sınıfından türemiş olsun ve SuperClass’ta bulunan kare, dikdörtgen ve üçgen için çevre hesaplayan metotları miras alsın.
Örnek üzerinden ilerlemek adına bir problem belirledik ancak Method Overloading ve Method Overriding karşılaştırmasını yapabilmek adına öncelikle metotlarda imza kavramına değinmemiz gerekiyor.
İMZA KAVRAMI
Metotların kendine has özellikleri bulunur ve bu özellikler Metot İmzası olarak adlandırılır. Bu kendine has özellikler Metot adı ve parametre listesinden meydana gelir. Parametre listesi ise metot çağırırken gönderilen parametrelerin düzenini ifade eder ve parametrelerin tipi, sırası ve sayısından ibarettir. Örneğin :
1- int a, int b (2 ile aynı, diğerlerinden farklı)
2- int c, int d (1 ile aynı, diğerlerinden farklı)
3- String a, int b (Hepsinden farklı) (4 ile sıra farklılığı var)
4- int c, String d (Hepsinden farklı) (3 ile sıra farklılığı var)
5- boolean a, char b (Hepsinden farklı) (Hepsinden tip olarak ayrılıyor)
6- int a, int b, int c (Hepsinden farklı) (Hepsinden sayı olarak ayrılıyor)
İmza kavramı derleyicinin çalışması açısından oldukça önemlidir. Bir sınıf içerisinde aynı imzaya sahip yalnızca bir tane metot tanımlanabilir. Aksi mümkün değildir. Bu noktada derleyici hangi metodu kullanması gerektiğini belirleyemez. Örneğin :
Yukarıdaki örnekte eğer Calculator sınıfından bir nesne oluşturup calculateArea metodunu kullanmaya kalkarsanız program çalışmayacaktır ve Java hata(java.lang.RuntimeException: Uncompilable source code — method calculateArea(int,int) is already defined in class Calculator) verecektir. Bunun sebebi, birebir aynı olan iki metodu aynı sınıf içerisinde tanımlamaya çalışmanızdır. Parametre isimlerinin ve metot içerisinde gerçekleştirilen işlemlerin birbirinden farklı olmasının herhangi bir önemi olmadığına dikkat ediniz. Ayrıca, metotların sahip olduğu dönüş değerlerinin ve fırlattıkları hatalarının da bir önemi yoktur. Örneğin yukarıdaki örnekte, eğer ilk calculateArea() metodu int değer ve ikinci calculateArea() metodu double değer döndürseydi, Java yine hata verirdi. Bunun sebebi ise metotları çağırırken dönüş değerlerini belirtmememizdir.
Peki aynı sınıf içerisinde aynı isimde birden fazla metot tanımlamak mümkün mü ?
Elbette mümkün. Örneğin, bir sınıfta birden fazla Constructor Method tanımlanabileceğini görmüştük. Önemli olan parametre düzenlerinin farklı olmasıdır. Gerçekleştirilen bu işlem ise Method Overloading olarak adlandırılır.
METHOD OVERLOADING
Bir sınıf içerisinde bulunan birden fazla metodun farklı parametre listesine sahip olma koşulu ile aynı isme sahip olmaları durumudur. Bu sayede belirli bir amaç için tasarlanan sınıfta, aynı işlemi farklı şekillerde gerçekleştirecek metotlar oluşturmak mümkün hale gelir. Kendi örneğimiz üzerinden ilerleyecek olursak :
Görüldüğü gibi alan hesaplamaya yarayan iki farklı metot bulunmakta ve bu metotlar aynı isme sahip olabilmektedirler. Dikkatinizi çektiği üzere aldıkları parametre sayıları faklı olduğundan derleyici bu noktada herhangi bir sıkıntı yaşamamaktadır. Bu işlem Method Overloading olarak adlandırılır.
METHOD OVERRIDING
Inheritance konusunu incelerken bu kavramı detaylı olarak ele almıştık. İsterseniz o yazımızdaki tanımımızı hatırlayalım :
Üst sınıfa ait özelliklerin alt sınıflar tarafından nasıl miras alındığını öğrendik. Aynı şekilde alt sınıf, üst sınıfta bulunan metotları da miras almak, kendi içerisinde kullanmak isteyebilir. İşte bu işleme Method Overriding adı verilir. Bu kavram dilimizde Ezme, Geçersiz Kılma gibi anlamlara gelmektedir. Bu şekilde isimlendirilmesinin sebebi ise alt sınıfın, üst sınıftan metot miras alması durumunda üst sınıftaki metodun geçerliliğini kaybetmesidir. Yani alt sınıf miras aldığı metot ile birlikte, üst sınıfın sahip olduğu metodu ezer, onun yerine geçmiş olur. Bu kavramı daha iyi anlamak için şu şekilde de izah edebiliriz : Alt sınıfın, üst sınıftaki metod ile aynı isimde bir metot tanımlayarak, kendi ihtiyaçları ve istekleri doğrultusunda bu metoda işlevler yüklemesidir, yani bir metodun yeniden yazılmasıdır.
(Not : Kavramın daha ayrıntılı incelemesini görmek için Inheritance yazımıza göz atabilirsiniz. Ayrıca, henüz Interface gibi konulara giriş yapmadığımız için Overriding kavramını şimdilik Inheritance üzerinden anlıyor olmanız yeterli olacaktır. Önemli olan temel kullanım mantığını öğrenmektir.)
Yukarıdaki tanımlamaların daha anlaşılır hale gelmesi açısından bu yazımızdaki örneğimiz üzerinden ilerleyelim :
Görüldüğü gibi Calculator sınıfı MahtematicalProcesses sınıfından calculatePerimeter() metodunu miras aldı. Yani SubClass, SuperClass içerisinde bulunan metot ile birebir aynı imzaya sahip bir metot bulunduruyor. Bu işlem Method Overriding olarak adlandırılır.
OVERLOADING VE OVERRIDING KARŞILAŞTIRMASI
1- Overloading metotların gövdeleri farklı olabilir. Aynı şekilde Overriding işleminde de metotlar farklı gövdelere sahip olabilirler. Böylece hem Overload hem de Override metotlar farklı işlevleri yerine getiriyor olabilir.
2- Overloading işleminde metot isimleri birebir aynıdır. Aynı şekilde Overriding işleminde de metot isimleri birebir aynıdır.
3- Overloading işleminde metotların parametre listeleri farklı olmak zorundadır. Overriding işleminde ise metotların parametre düzenleri de birebir aynıdır.
4- Overloading aynı sınıf içerisindeki metotlar arasında görülebilir. Overriding ise SuperClass ve SubClass arasındaki metotlarda görülür. (Not : Overloading ayrıca SuperClass ve SubClass arasındaki metotlarda da görülebilir. Yani her iki sınıfta da aynı isimde ve farklı parametre yapısına sahip metot bulunabilir. Bu maddeyi bu şekilde yazmamızın sebebi Overriding için sadece tek bir sınıfın söz konusu olamayacağını vurgulamak istememiz.)
5- Overloading işleminde kullanılacak olan metot derleme zamanında belirlenir. Overriding işleminde ise kullanılacak metot çalışma zamanında belirlenir.
6- Overloading hataları derleme zamanında ortaya çıktığından dolayı düzeltilmeleri kolaydır. Overriding hataları ise çalışma zamanında ortaya çıktığından dolayı daha ciddi problemlere sebebiyet verebilir.
KARŞILAŞILAN JAVA ÖRNEKLERİ
Method Overloading ve Method Overriding kavramlarını henüz yeni öğrenmiş olabilirsiniz. Aslında farkında olmadan Overloading ve Overriding örneklerini defalarca kez kullandığınıza emin olun. Java yapısını incelediğimizde pek çok örneğini görebiliriz. Böylece Overloading ve Overriding kavramlarının ne kadar önemli olduğunu tahmin edebilirsiniz. İsterseniz daha önce muhtemelen farketmeden kullandığımız örneklerini incelemeye başlayalım.
Java’da bir Overloading örneği :
Gördüğünüz gibi, print() isminde pek çok farklı metodu kullanma imkanınız bulunmaktadır. Bu durum bir Method Overloading örneğidir. (İncelemek için ctrl tuşuna basılı tutarak System.out.print() üzerindeki print yazısına tıklayabilirsiniz.)
Java’da bir Overriding örneği :
Gördüğünüz gibi, ArrayList sınıfı içerisinde bulunan replaceAll() ve sort() metotları Override edilmiş metotlardır.
PROJE
Method Overloading ve Method Overriding kavramlarını ayrıntılı olarak inceleyerek kavramların benzerlik ve farklılıklarını öğrendiğimize göre kendi projemizin tamamını incelemeye başlayabiliriz :
Output :
Kenar uzunluğu 3 olan kare çevresi : 12
Kenar uzunlukları 5 ve 6 olan dikdörtgen çevresi : 22
Kenar uzunluğu 5 olan kare alanı : 25
Kenarları 3,4,5 olan üçgen alanı : 6.0
Yararlandığım Kaynaklar :
Bir sonraki yazıya göz atmak isteyebilirsiniz :