Pure Java – 13 Object Orientation – 04 Overloaded

Merhaba Arkadaslar,
Bu yazimda Java’da Overloaded(asiri yukleme) kavramindan bahsedecegim. Bir onceki  yazimda Overridding kavramindan bahsetmistim.

Java’da , metot parametre deklarasyonu/ifadesi/tanimlamasi farkli olmasi kosuluyla , ayni sinif veya altsinifta ayni isimde birden fazla metot tanimlanabilir. Bu metotlara Java’ da asiri yuklenmis/ Overloaded metot denir.

Asiri yuklenmis/overloaded metot cagrildiginda hangi metodun cagrilacagina karar vermek icin,  arguman tipi ve/veya sayisi kullanilir. Bu nedenle asiri yuklenmis/overloaded metotlarin parametreleri sayisi ve/veya turu farkli olmak zorundadir.

Basit bir ornek ile baslayalim ;

Sum.java

public class Sum {

	public static void main(String[] args) {
		Sum s= new Sum();
		System.out.println(s.getSum(10, 20));    // int
		System.out.println(s.getSum(5.5, 20));  //double 
		System.out.println(s.getSum(10, 2.7));  //double
		System.out.println(s.getSum(1.4, 2.2)); //double
	}
	public int getSum(int a, int b) {
		return a + b;
	}

	public double getSum(double a, double b) {
		return a + b;
	}
}

Gordugunuz gibi cesitli  degerlerle metotlari cagiriyoruz. Java bizim icin gerekli ayarlamalari yapiyor yani 2.metot icin 5.5 degeri ve 20.0 olarak metoda uyacak sekilde ayarliyor. Bu kucuk ornekten sonra devam edelim ve 2. ornegimize bakalim;

AnimalTest.java

class Animal {
	public void eat() {
		System.out.println("Animal-Eat");
	}

	public void eat(String s) {
		System.out.println("Animal-Eat Overloaded");
	}
	public void eat(Animal a) {
		System.out.println("Animal-Eat Animal");
	}
}

class Bird extends Animal {

	@Override
	public void eat() {
		System.out.println("Bird-Eat Override");
	}

	public void eat(int a) {
		System.out.println("Bird-Eat Overloaded");
	}

	public void eat(Bird a) {
		System.out.println("Bird-Eat Animal");
	}
}

public class AnimalTest {
	public static void main(String[] args) {
		Animal a = new Animal();
		Bird b= new Bird();
		Animal ab = new Bird();

		a.eat();
		a.eat("overloaded");
		a.eat(a);

		b.eat();
		b.eat(1);
		b.eat(b);

		ab.eat();
		ab.eat("overloaded");
		ab.eat(ab);
	}

}

Animal-Eat
Animal-Eat Overloaded
Animal-Eat Animal
Bird-Eat Override
Bird-Eat Overloaded
Bird-Eat Animal
Bird-Eat Override
Animal-Eat Overloaded
Animal-Eat Animal

Ornegimizi inceledigimizde ozellikle dikkat etmemiz gereken nokta

ab.eat(ab);

Neden Animal-Eat Animal metodunu cagirdi ? Neden Bird-Eat Animal sinifini cagirmadi ?

Hangi Overloaded metodun cagrilacagagi overridded metotlarin aksine , dinamik olarak Runtime ‘da degil compile(derleme) zamaninda belirlenir. Overloaded metotlarda Overridden metotlarin aksine Obje turu degil referans turu onemlidir ve referans turune gore ilgili metot cagrilir.

Simdi de overloaded metotlarin ozelliklerini incelemeye devam edelim ;

  • Overloaded metotlarin arguman listesi degismek/farkli olmak ZORUNDADIR!
  • Overloaded metotlarin donus tipleri degisebilir.
  • Overloaded metotlarin access modifier /erisim belirtecleri degisebilir. (public private..)
  • Overloaded metotlarda yeni exception tanimlanabilir veya tanimlanan exception genisletilebilir.
  • Overloaded metotlar ayni sinifta veya alt sinifta tanimlanabilir.
  • Ayni anda hem overloading hem overriding metotlar kullanilabilir.

Ne demek istedigimizi daha iyi anlayabilmek adina bu ozellikleri kod uzerinde gorelim ;

OverloadedTest.java

public class OverloadedTest {
	public void OverloadedMethod() {

	}

	public void OverloadedMethod(int a) {

	}

	String OverloadedMethod(String s) {
		return s;
	}

	private int OverloadedMethod(char a) throws IllegalArgumentException{
		return 1;
	}

	protected Integer OverloadedMethod(boolean b, double d) {
		return 1;
	}	

}

class SubOverloadedTest extends OverloadedTest {
	@Override 
	public void OverloadedMethod(int a) {}

	public void OverloadedMethod(int a,int b) {}
}

Ornegimizi dikkatlice inceledegimizde yazdigim ozellikleri uyguladigimizi gorebilirsiniz.

  • 1.metodumuz parametre almiyor ve public olarak tanimlandi.
  • 2.metodumuz int bir parametre aliyor vepublic olarak tanimlandi.
  • 3.metodumuzda donus tipini degistirdik , sadece donus tipini degistirmek yeterli olmaz, mutlaka ama mutlaka parametre listesi farkli olmalidir. Ayrica metodumuz icin varsayilan erisim belirteci kullanildi.
  • 4.metotta protected erisim belirtecini kullandik ve metodumuzda bir exception(istisna) tanimladik.
  • 5.metotta private erisim belirtecini kullandik.
  • 6.metotta overloading (asiri yukleme) islemi degil overriding (gecersiz kilma) islemi var.
  • 7.metotta yine overloading islemi gerceklestirdik, alt siniflarda da overloaded metot tanimlayabiliriz.

Overloaded metotlarin biraz daha detayina ilerleyen yazilarimda girecegim.Simdilik bu kadar detay yeterli olacaktir 🙂

Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
injavawetrust

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *