logo

Metoda přetížení v Javě

  1. Různé způsoby přetížení metody
  2. Změnou č. argumentů
  3. Změnou datového typu
  4. Proč přetížení metody není možné změnou návratového typu
  5. Můžeme přetížit hlavní metodu
  6. přetížení metody pomocí Type Promotion

Pokud třída má více metod se stejným názvem, ale odlišnými parametry, je známý jako Přetížení metody .

Pokud musíme provést pouze jednu operaci, stejný název metod zvyšuje čitelnost program .

java null check

Předpokládejme, že musíte provést sčítání daných čísel, ale může být libovolný počet argumentů, pokud napíšete metodu jako a(int,int) pro dva parametry a b(int,int,int) pro tři parametry, pak to může být pro vás i pro ostatní programátory obtížné porozumět chování metody, protože její název se liší.

Takže provádíme přetížení metod, abychom program rychle zjistili.

přetížení java metody

Výhoda přetížení metody

Přetížení metody zvyšuje čitelnost programu .

Různé způsoby přetížení metody

Existují dva způsoby, jak přetížit metodu v Javě

  1. Změnou počtu argumentů
  2. Změnou datového typu

V Javě není přetížení metody možné pouze změnou návratového typu metody.


1) Metoda přetížení: změna č. argumentů

V tomto příkladu jsme vytvořili dvě metody, první metoda add() provádí sčítání dvou čísel a druhá metoda add provádí sčítání tří čísel.

V tomto příkladu tvoříme statické metody abychom nemuseli vytvářet instance pro volání metod.

 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)); }} 
Otestujte to hned

Výstup:

 22 33 


2) Přetížení metody: změna datového typu argumentů

V tomto příkladu jsme vytvořili dvě metody, které se liší Otestujte to hned

Výstup:

 22 24.9 

Otázka: Proč přetížení metody není možné pouze změnou návratového typu metody?

V Javě není přetížení metody možné změnou návratového typu metody pouze z důvodu nejednoznačnosti. Podívejme se, jak může dojít k nejednoznačnosti:

co je uživatelské jméno
 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 }} 
Otestujte to hned

Výstup:

 Compile Time Error: method add(int,int) is already defined in class Adder 

System.out.println(Adder.add(11,11)); //Jak může java určit, která metoda sum() by měla být volána?

Poznámka: Compile Time Error je lepší než Run Time Error. Takže kompilátor java vykreslí chybu času kompilátoru, pokud deklarujete stejnou metodu se stejnými parametry.

Můžeme přetížit metodu java main()?

Ano, přetížením metody. Přetížením metody můžete mít ve třídě libovolný počet hlavních metod. Ale JVM volá metodu main(), která přijímá pole řetězců pouze jako argumenty. Podívejme se na jednoduchý pří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');} } 
Otestujte to hned

Výstup:

 main with String[] 

Přetížení metody a propagace typu

Jeden typ je implicitně povýšen na jiný, pokud není nalezen žádný odpovídající datový typ. Pojďme pochopit koncept podle obrázku uvedeného níže:

Přetížení metody Java s podporou typu

Jak je znázorněno na výše uvedeném diagramu, bajt lze povýšit na short, int, long, float nebo double. Datový typ short lze povýšit na int, long, float nebo double. Datový typ char lze povýšit na int, long, float nebo double a tak dále.

Příklad přetížení metody pomocí 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); } } 
Otestujte to hned
 Output:40 60 

Příklad přetížení metody s podporou typu, pokud byla nalezena shoda

Pokud jsou v metodě odpovídající argumenty typu, povýšení typu se neprovede.

 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 } } 
Otestujte to hned
 Output:int arg method invoked 

Příklad přetížení metody s propagací typu v případě nejasností

Pokud v metodě nejsou žádné odpovídající argumenty typu a každá metoda podporuje podobný počet argumentů, dojde k nejednoznačnosti.

 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 } } 
Otestujte to hned
 Output:Compile Time Error 

Jeden typ není implicitně depropagován, například double nemůže být implicitně deproportován na žádný typ.