4. Preopterećenje (overloading) metoda u Javi


Ako klasa ima više metoda istog imena ali različitih parametara, to je poznato kao Preopterećenje (overloading) metoda. Ako se mora izvesti samo jedna operacija, isto ime metoda poboljšava čitljivost programa. Pretpostavimo da treba izvesti sabiranje datih brojeva ali da može biti bilo koji broj argumenata, ako napišemo metod kao što je a(int,int) za dva parametra, i b(int,int,int) za tri parametra tada može biti teško kako autoru tako i drugim programerima da shvate ponašanje metoda zato što im se imena razlikuju. Zato uvodimo preopterećenje metoda da bismo brže razumjeli program. Prednosti preopterećenja metoda Preopterećenje metoda poboljšava čitljivost programa. Različiti načini preopterećenja metode Postoje dva načina preopterećenja metoda u Javi

  1. Promjena broja argumenata
  2. Promjena tipa podataka

Napomena: U Javi, preopterećenje metoda nije moguće promjenom return tipa metode (tipa koji metoda vraća).



1) Primjer preopterećenja metode promjenom broja argumenata

U ovom primjeru, kreiraćemo dve preopterećene metode, prva sum metoda vrši sabiranje dva broja, a druga sum metoda vrši sabiranje tri broja.

class Calculation{  
  void sum(int a,int b){System.out.println(a+b);}  
  void sum(int a,int b,int c){System.out.println(a+b+c);}  
  
  public static void main(String args[]){  
  Calculation obj=new Calculation();  
  obj.sum(10,10,10);  
  obj.sum(20,20);  
  
  }  
}

Ispis na ekranu:
30
40

2) Primjer preopterećenja metode promjenom tipa podataka argumenata U ovom primjeru, kreiraćemo dva preopterećena metoda koji se razlikuju po tipu podataka. Prva sum metoda prima dva cjelobrojna (int) argumenta, a druga sum metoda prima dva double argumenta.

class Calculation2{  
  void sum(int a,int b){System.out.println(a+b);}  
  void sum(double a,double b){System.out.println(a+b);}  
  
  public static void main(String args[]){  
  Calculation2 obj=new Calculation2();  
  obj.sum(10.5,10.5);  
  obj.sum(20,20);  
  
  }  
}

Ispis na ekranu:
21.0
40

Zašto nije moguće preopterećenje metode promjenom return tipa metode? U Javi, preopterećenje metode nije moguće promjenom return tipa metode zato što se može javiti dvosmislenost. Pogledajmo kako do nje može doći. Javiće se ovakav problem:

class Calculation3{  
  int sum(int a,int b){System.out.println(a+b);}  
  double sum(int a,int b){System.out.println(a+b);}  
  
  public static void main(String args[]){  
  Calculation3 obj=new Calculation3();  
  int result=obj.sum(20,20); //Compile Time Error  (greška u vremenu kompajliranja)
  
  }  
}

Ispis na ekranu:
65.54/Calculation3.java:3: error: method sum(int,int) is already defined in class Calculation3
ntln(a+b);}

Može li se preopteretiti main() metoda? Da, može. Moguće je imati bilo koji broj main metoda u klasi pomoću preopterećenja metode. Pogledajmo jednostavan primjer:

class Overloading1{  
  public static void main(int a){  
  System.out.println(a);  
  }  
    
  public static void main(String args[]){  
  System.out.println("main() metoda pozvana");  
  main(10);  
  }  
}

Ispis na ekranu:
main() metoda pozvana
10

Preopterećenje metode i promocija tipa (TypePromotion) Jedan tip je promoviran u drugi implicitno ako nije pronađen nijedan podudarajući tip podatka. Sljedeća slika pojašnjava koncept:

Kao što se vidi na dijagramu, byte se može promovisati u short, int, long, float ili double. Tip podatka short može se promovisati u int, long, float ili double. Tip char se može promovisati u int, long, float ili double itd.

Primjer preopterećenja metoda sa promocijom tipa

class OverloadingCalculation1{  
  void sum(int a,long b){System.out.println(a+b);}  
  void sum(int a,int b,int c){System.out.println(a+b+c);}  
  
  public static void main(String args[]){  
  OverloadingCalculation1 obj=new OverloadingCalculation1();  
  obj.sum(20,20); //ovdje će drugi int literal biti promovisan u long  
  obj.sum(20,20,20);  
  
  }  
}

Ispis na ekranu:
40
60

Primjer preopterećenja metoda sa promocijom tipa ako je pronađeno poklapanje Ako postoji poklapanje tipova argumenata u metodi, promocija tipa se ne vrši.

class OverloadingCalculation2{  
  void sum(int a,int b){System.out.println("int arg metod pozvan");}  
  void sum(long a,long b){System.out.println("long arg metod pozvan");}  
  
  public static void main(String args[]){  
  OverloadingCalculation2 obj=new OverloadingCalculation2();  
  obj.sum(20,20); //ovdje je int arg sum() metod pozvan  
  }  
}

Ispis na ekranu:
int arg metod pozvan

Primjer preopterećenja metoda sa promocijom tipa u slučaju dvosmislenosti Ako u metodi nema argumenata koji se slažu po tipu, i svaki metod promoviše sličan broj argumenata, doći će do dvosmislenosti.

class OverloadingCalculation3{  
  void sum(int a,long b){System.out.println("a metod pozvan");}  
  void sum(long a,int b){System.out.println("b metod pozvan");}  
  
  public static void main(String args[]){  
  OverloadingCalculation3 obj=new OverloadingCalculation3();  
  obj.sum(20,20); //ovdje postoji dvosmislenost  
  }  
}

Ispis na ekranu:
Compile Time Error

Napomena: Tip se ne de-promoviše implicitno, napr. double se ne može depromovisati u neki drugi tip implicitno.


Zadaci iz ovog poglavlja    Objektno orijentisano programiranje u Javi    Index