17 Nisan 2012 Salı

JAVADA OVERRIDING VE OVERLOADING

Override inheritance movzusun yazanda demisdim nedi.super class-da olan 1 metodu sub class-da yazib icini deyisdirmek.Abstract metodlar mutleq sub class terefinden overriden olunmalidir.

public class Animal{
public void eat(){
System.out.print("Animal");
}
}
public class Horse extends Animal{
public void eat(){
System.out.print("Horse");
}
public void buck(){
System.out.print("Horse buck");
}
}
public class Test {
public static void main(String [] args){
Animal a=new Animal();
Animal b=new Horse();
a.eat();            //    burada eat() metodu Animal class-dakin cagirir.
b.eat();            // burada ise eat() metodu Horse class-dakin cagirir.Cunki metod artiq override olunub.

Animal c=new Horse();
c.burk();  yazsaq burada xeta verecek.Cunki Animal class-da buck() adli 1 metod yoxdur.Polymorphism dediyimiz kimi ancaq eyni adli metodlara aid edilir.yeni 1 metod hem super class-da hemde sub class-da olmalidir.eger ferqli 1 metod olarsa bunu polymorhism-e aid etmek olmaz.
Note: 

  • private
  • default
  • protected
  • public
yeni public olan 1 metodu override edib private etmek olmaz veya basqalari.

Override olan 1 metodun  override olmus 1 metoddan daha cox mehdudlasdirici modifier-i ola bilmez.
Override zamani asagidaki sertler odenilmelidir:

  • Argument list override olmus metodla uygun olmalidir.Eger onlar uygun olmasa , bu overloading olar.
  • Return tip eyni olmalidir.
  • Override olunan metodda Access level cox mehdudlasdirici ola bilmez override etmis metoddan ferqli olaraq.
  • 1 az mehdudlasdirici ola biler.
  • Override olunan 1 metod unchecked(runtime exception)ata biler.
  • Override olunan 1 metod checked exception atmamalidir.
  • Final olan 1 metod override oluna bilmez.
  • Static olan 1 metod override oluna bilmez.
  • Eger 1 metod inherit olunmursa o zaman onu override ede bilmerik.
public class Animal{
private void eat(){}
}

public class Horse extends Animal{ }

public class test{
public static void main( String [] args){
Horse h=new Horse();
h.eat();                                          //      legal deyil.Cunki Horse eat() metodunu override etmeyib.private olan 1 metod ancaq oz class-nin icindekilere gorunurdu.
Eger hem super class-daki hemdeki sub class-daki metodu 1-likde isletmek istesek o zaman
public class Test{
public void eat(){
super.eat();
}
}
bu zaman 1 ci super class-daki sonra ise sub class-daki metod calisacaqdir.Eger metod private olsa bu zaman super yazanda hemin metod xeta verecek.Bununda sebebi private olan 1 metod veya deyisenin yalniz oz class-i icindekilere gorunmesidi.

public class Animal{
public void eat() throws Exception{ }
}

public class Horse{
public void eat() { }
}

Burada run class-da Animaldaki eat() metodu error verecek.


public class Animal{
public void eat() { }
}

public class Horse{
public void eat()throws Exception { }    // burda ise hemin anda xeta verecek.run class-da deyil.Umumiyyetle bu hissede check Exception yazmaq duzgun deyil cunki hemin anda xeta verecek.
}
Note:  Override zamani metod check atsa run time vaxti xeta verecek.hem ozunde olan metod hemdeki sub-inda olan metod.Metodlar ancaq uncheck exception atmalidirlar.Eger super class 1 uncheck exception atirsa sub class ya hecne atmamali,ya hemin exceptionu atmali yadaki o exceptionun sub classni atmalidir.Ancaq Exceptionun super class-i kimi Exception goturulse bu hemin anda xeta verecek.Cunki icinde hem uncheck hemde check exception olur.

Indi ise overloadingden danismaq isterdim.
Overloaded metodlar class-da eyni adli metodlari yeniden istifade etmeye icaze verir.Amma muxtelif argumentlerle.
Burada qaydalar cox sadedir:

  • Overload olunmus metodlarin argument listleri muxtelif olmalidi.
  • Overload olunmus metodlarin return tipleri deyisken ola biler.
  • Overload olunmus metodlar access modifier-i deyise biler.
  • Overload olunmus metodlar check exception ata bilerler.
  • 1 metod eyni class-da veya onun sub class-da overload oluna biler.



public class Animal{
public void eat(int y,String s) { }
}

public class Horse{
public void eat(int y,long s) throws IOException{ }    //   override-dan ferqli olaraq check ex.ata biler.Ancaq 1 ferq xeta burda deyilde run zamani olacaq.
}

Animal a=new Cat();
Burada a -referans tipidir.mueyyen edir hansi overload olunmus versiyanin secildiyini.(argument liste esaslanaraq).Compile vaxti bas verir.Overloaded olunmus metodda.
Burada new Cat();  obje tipidir.Basqa sozle,heap-de olan heqiqi objenin tipi.mueyyen edir hansi metodun secildiyin. Runtime vaxti bas verir.Override olunmus metodda.

Hiç yorum yok:

Yorum Gönder