12 Object Orientation – 03 Overridden

Merhaba Arkadaslar,
Bu yazimda Java da Overriding kavramindan bahsedecegim .Javada bir sinifi kalittigimizda (extends) ust sinifta bulunan bir metodu alt sinifta ezebiliriz/override. Hatirlayacagimiz gibi final olarak tanimlanan metotlar override edilemezler.

Test sinifimiz uzerinde devam edelim..

TestAnimals.java

class Animal {

        int height=15;
	static int size=10;

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

class Bird extends Animal {

        int height=3;
	static int size=5;

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

	static void breathe() {
		System.out.println("Bird- Breath");
	}

	public void fly() {
		System.out.println("Bird-fly");
	}
}

public class TestAnimals {
	public static void main(String[] args) {
		Animal a = new Animal();
		Animal b = new Bird();
		Bird c = new Bird();
               //Bird d = new Animal();

		a.eat();
		b.eat();
		c.eat();

		a.breathe();
		b.breathe();
		c.breathe();

		//a.fly(); 
		//b.fly();
		c.fly();

		System.out.println(a.height + " "+ a.size);
		System.out.println(b.height + " "+ b.size);
		System.out.println(c.height + " "+ c.size);
	}
}
  • Bird sinifi Animal sinifini kalitmaktadir ve eat() metodunu ezmektedir. @Override notasyonunu kullanabiliriz.
  • static metotlar override edilmezler, tekrar tanimlanirlar /redefined.

Ornegimizi calistirdigimizda su ciktiyi aliriz :

Animal-Eat
Bird-Eat
Bird-Eat
Animal- Breath
Animal- Breath
Bird- Breath
Bird-fly
15 10
15 10
3 5

Ciktilari tek tek inceleyelim,

Animal a = new Animal();
a.eat();

a referans degiskeninin Animal sinifinda bulunan eat() metodunu cagirmasi gayet dogal.

Animal b = new Bird();
b.eat();

b referans degiskeni Animal turundedir neden Bird sinifina ait eat() metodu cagrildi ?
Cunku Obje Bird objesidir ( new Bird(); ) . Java ‘da override edilen metotlar icin obje turune bakilir. Burada Animal sinifinda yer alan eat() metodu degil Bird sinifinda override edilen eat() metodu cagrilir.

Bird c = new Bird();
c.eat();

c referans degiskeni Bird turundedir ve yaratilan obje de Bird turundendir. Bu nedenle Bird sinifinda yer alan eat() metodu cagrilir.

Bird d = new Animal();

Type mismatch hatasi aliriz. Cunku Animal IS-A Bird testi saglanmaz.
Javada hiyerarsik olarak altta olan bir sinifin referans degiskeni ( burada d ) hic bir sekilde hiyerarsik olarak ustte olan (super class) bir sinifin objesini referans edemez. Yani sag tarafa new ile yazilan hic bir sinif soldaki sinifin ust sinifi olamaz.

static metotlarin cagrilmasina bakacak olursak ;

a.breathe();

a referans degiskeni ile cagrilarn breathe() metodunun Animal sinifinda yer alan breathe() metodu olmasini bekleriz. Burada bir problem yok.

b.breathe();

peki b referans degiskeni neden Animal sinifindaki breathe() metodunu cagirdi. Biraz once ayni b referans degiskeni Animal sinifindaki degil Bird sinifindaki metodu eat() metodunu cagirmisti. static metotlar override edilemezler ! Bu nedenle objenin turune degil referans degiskeninin turune bakilir. Referans degiskenimiz Animal turunde oldugu icin Animal sinifinda yer alan breathe() metodu cagrilir !

c.breathe();

c referans degiskeni ile cagrilan breathe() metodu Bird sinifina ait olacaktir. Burada farkli bir durum yoktur.

//a.fly(); 
//b.fly();

a referans degiskeni zaten Animal turunde bir objeyi referans ettigi icin , Animal sinifinda olmayan fly() metodunu cagiramaz. Burada ilginc bir durum yok.
b referans degiskeni Animal turunde olmasina ragmen Bird turunde bir objeye referansta bulunur. Bird sinifi fly() metoduna sahiptir. Fakat buna ragmen fly() metodu b referans degiskeni ile cagrilamaz. Cunku b referans degiskeni Animal turundedir ve Animal sinifinda boyle bir metot yoktur.

c.fly();

c referans degiskeni hem Bird turundedir hem de bir Bird objesine referansta bulunur. Bu nedenle sorunsuzca fly() metodu cagrilabilir.

Degiskenlerin cagrilmasini inceleyecek olursak ;

System.out.println(a.height + " "+ a.size);

a referans degiskeni ile height ve size degiskenlerine ulasiyoruz. Tahmin ettigimiz gibi Animal sinifinda verilen degerler geliyor ,15 ve 10

System.out.println(b.height + " "+ b.size);

b referans degiskeni static metotda oldugu gibi yine Animal sinifinda atanan degerleri dikkate alacaktir. Referans degiskenimiz Animal turundedir , dolayisiyla 15 ve 10 sonuclari atanacaktir.

System.out.println(c.height + " "+ c.size);

c referans degiskeni Bird turunde ve yaratilan objede Bird turunde oldugu ici zaten Bird sinifinda yer alan atama islemleri dikkate alinacaktir.

Sonuc olarak soyleyebiliriz ki ;

  • Override edilen metotlar icin Javada calisma zamaninda hangi metodun cagrilacagini objenin turu belirler
  • static metotlar override edilemezler, tekrar tanimlanirlar /redefined. Bu nedenle objenin turu degil referans degiskeninin turu dikkate alinir.
  • Degiskenlerin cagrilmasi/atanmasi da referans degiskeninin turune goredir.
  • Sadece ama sadece override edilen metotlar icin obje turune bakilir !

Java da Override ile ilgili ilk kismi burada bitiriyorum.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*
*