Preopterećenje (overloading) metoda u Javi

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 razumeli 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. Promena broja argumenata
  2. Promena tipa podataka

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

 

1) Primer preopterećenja metode promenom broja argumenata

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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) Primer preopterećenja metode promenom tipa podataka argumenata U ovom primeru, kreiraćemo dva preopterećena metoda koji se razlikuju po tipu podataka. Prva sum metoda prima dva celobrojna (int) argumenta, a druga sum metoda prima dva double argumenta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 promenom return tipa metode? U Javi, preopterećenje metode nije moguće promenom return tipa metode zato što se može javiti dvosmislenost. Pogledajmo kako do nje može doći. Javiće se ovakav problem:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 primer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 promovisan u drugi implicitno ako nije pronađen nijedan podudarajući tip podatka. Sledeć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.

Primer preopterećenja metoda sa promocijom tipa

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

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

1
2
3
4
5
6
7
8
9
10
11
12
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

Primer 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.

1
2
3
4
5
6
7
8
9
10
11
12
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.

Comments

comments

Close Menu
Show Buttons
Hide Buttons