- Rôzne spôsoby preťaženia metódy
- Zmenou č. argumentov
- Zmenou dátového typu
- Prečo preťaženie metódy nie je možné zmenou typu návratu
- Môžeme preťažiť hlavnú metódu
- preťaženie metódy pomocou Type Promotion
Ak trieda má viacero metód s rovnakým názvom, ale odlišnými parametrami, je známy ako Preťaženie metódy .
Ak musíme vykonať iba jednu operáciu, rovnaký názov metód zvyšuje čitateľnosť program .
Java null check
Predpokladajme, že musíte vykonať sčítanie daných čísel, ale môže existovať ľubovoľný počet argumentov, ak napíšete metódu ako a(int,int) pre dva parametre a b(int,int,int) pre tri parametre, potom to môže byť pre vás, ako aj pre iných programátorov ťažké pochopiť správanie metódy, pretože jej názov sa líši.
Preto vykonávame preťaženie metódy, aby sme program rýchlo zistili.
Výhoda preťaženia metódy
Preťaženie metódy zvyšuje čitateľnosť programu .
Rôzne spôsoby preťaženia metódy
Existujú dva spôsoby preťaženia metódy v jazyku Java
- Zmenou počtu argumentov
- Zmenou typu údajov
V jazyku Java nie je možné preťaženie metód iba zmenou návratového typu metódy.
1) Spôsob Preťaženie: zmena č. argumentov
V tomto príklade sme vytvorili dve metódy, prvá metóda add() vykoná sčítanie dvoch čísel a druhá metóda add vykoná sčítanie troch čísel.
V tomto príklade tvoríme statické metódy aby sme nemuseli vytvárať inštanciu na volanie metód.
class Adder{ static int add(int a,int b){return a+b;} static int add(int a,int b,int c){return a+b+c;} } class TestOverloading1{ public static void main(String[] args){ System.out.println(Adder.add(11,11)); System.out.println(Adder.add(11,11,11)); }}Vyskúšajte to
Výkon:
22 33
2) Preťaženie metódy: zmena dátového typu argumentov
V tomto príklade sme vytvorili dve metódy, ktoré sa líšia Vyskúšajte to
Výkon:
22 24.9
Otázka: Prečo nie je možné preťaženie metódy iba zmenou typu návratu metódy?
V jave nie je možné preťaženie metódy zmenou návratového typu metódy len z dôvodu nejednoznačnosti. Pozrime sa, ako môže dôjsť k nejednoznačnosti:
class Adder{ static int add(int a,int b){return a+b;} static double add(int a,int b){return a+b;} } class TestOverloading3{ public static void main(String[] args){ System.out.println(Adder.add(11,11));//ambiguity }}Vyskúšajte to
Výkon:
javascriptové operátory
Compile Time Error: method add(int,int) is already defined in class Adder
System.out.println(Adder.add(11,11)); //Ako môže java určiť, ktorá metóda sum() by sa mala volať?
Poznámka: Compile Time Error je lepšia ako Run Time Error. Takže kompilátor java vykreslí časovú chybu kompilátora, ak deklarujete rovnakú metódu s rovnakými parametrami.
Môžeme preťažiť metódu java main()?
Áno, metódou preťaženia. V triede môžete mať ľubovoľný počet hlavných metód preťažením metódy. ale JVM volá metódu main(), ktorá prijíma pole reťazcov iba ako argumenty. Pozrime sa na jednoduchý príklad:
class TestOverloading4{ public static void main(String[] args){System.out.println('main with String[]');} public static void main(String args){System.out.println('main with String');} public static void main(){System.out.println('main without args');} }Vyskúšajte to
Výkon:
main with String[]
Preťaženie metódy a propagácia typu
Jeden typ sa implicitne povýši na iný, ak sa nenájde žiadny zodpovedajúci typ údajov. Poďme pochopiť koncept podľa obrázku nižšie:
Ako je znázornené vo vyššie uvedenom diagrame, bajt môže byť povýšený na short, int, long, float alebo double. Krátky dátový typ môže byť povýšený na int, long, float alebo double. Dátový typ char môže byť povýšený na int, long, float alebo double a tak ďalej.
Príklad preťaženia metódy pomocou TypePromotion
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);//now second int literal will be promoted to long obj.sum(20,20,20); } }Vyskúšajte to
Output:40 60
Príklad preťaženia metódy s propagáciou typu, ak sa nájde zhoda
Ak sú v metóde zhodné argumenty typu, propagácia typu sa nevykoná.
class OverloadingCalculation2{ void sum(int a,int b){System.out.println('int arg method invoked');} void sum(long a,long b){System.out.println('long arg method invoked');} public static void main(String args[]){ OverloadingCalculation2 obj=new OverloadingCalculation2(); obj.sum(20,20);//now int arg sum() method gets invoked } }Vyskúšajte to
Output:int arg method invoked
Príklad preťaženia metódy s propagáciou typu v prípade nejasností
Ak v metóde nie sú žiadne zodpovedajúce argumenty typu a každá metóda podporuje podobný počet argumentov, bude to nejednoznačnosť.
class OverloadingCalculation3{ void sum(int a,long b){System.out.println('a method invoked');} void sum(long a,int b){System.out.println('b method invoked');} public static void main(String args[]){ OverloadingCalculation3 obj=new OverloadingCalculation3(); obj.sum(20,20);//now ambiguity } }Vyskúšajte to
Output:Compile Time Error