logo

Sobrecàrrega de mètodes en Java

  1. Diferents maneres de sobrecarregar el mètode
  2. En canviar el núm. d'arguments
  3. En canviar el tipus de dades
  4. Per què la sobrecàrrega del mètode no és possible canviant el tipus de retorn
  5. Podem sobrecarregar el mètode principal
  6. sobrecàrrega de mètodes amb la promoció de tipus

Si a classe té diversos mètodes amb el mateix nom però diferents en paràmetres, es coneix com Sobrecàrrega del mètode .

Si només hem de realitzar una operació, tenir el mateix nom dels mètodes augmenta la llegibilitat del programa .

govinda

Suposem que heu de fer la suma dels nombres donats, però hi pot haver qualsevol nombre d'arguments, si escriviu el mètode com ara a(int,int) per a dos paràmetres i b(int,int,int) per a tres paràmetres, llavors pot ser difícil per a vostè i per a altres programadors entendre el comportament del mètode perquè el seu nom és diferent.

Per tant, realitzem una sobrecàrrega de mètodes per esbrinar el programa ràpidament.

sobrecàrrega del mètode java

Avantatge de la sobrecàrrega del mètode

Sobrecàrrega del mètode augmenta la llegibilitat del programa .

Diferents maneres de sobrecarregar el mètode

Hi ha dues maneres de sobrecarregar el mètode a Java

  1. Canviant el nombre d'arguments
  2. En canviar el tipus de dades

A Java, la sobrecàrrega de mètodes no és possible canviant només el tipus de retorn del mètode.


1) Mètode Sobrecàrrega: canviant núm. d'arguments

En aquest exemple, hem creat dos mètodes, el primer mètode add() fa la suma de dos nombres i el segon mètode suma realitza la suma de tres nombres.

En aquest exemple, estem creant mètodes estàtics de manera que no necessitem crear una instància per cridar mètodes.

 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)); }} 
Prova-ho ara

Sortida:

 22 33 


2) Sobrecàrrega de mètodes: canvi de tipus de dades dels arguments

En aquest exemple, hem creat dos mètodes que es diferencien Prova-ho ara

Sortida:

 22 24.9 

P) Per què no és possible la sobrecàrrega de mètodes canviant només el tipus de mètode de retorn?

A java, la sobrecàrrega del mètode no és possible canviant el tipus de retorn del mètode només per ambigüitat. Vegem com es pot produir l'ambigüitat:

 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 }} 
Prova-ho ara

Sortida:

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

System.out.println(Adder.add(11,11)); //Aquí, com pot java determinar quin mètode sum() s'ha de cridar?

Nota: l'error de temps de compilació és millor que l'error de temps d'execució. Per tant, el compilador Java mostra un error de temps del compilador si declareu que el mateix mètode té els mateixos paràmetres.

Podem sobrecarregar el mètode java main()?

Sí, per mètode de sobrecàrrega. Podeu tenir qualsevol nombre de mètodes principals en una classe per sobrecàrrega de mètodes. Però JVM crida al mètode main() que només rep la matriu de cadenes com a arguments. Vegem un exemple senzill:

c++ converteix int en cadena
 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');} } 
Prova-ho ara

Sortida:

 main with String[] 

Sobrecàrrega de mètodes i promoció de tipus

Un tipus es promociona a un altre implícitament si no es troba cap tipus de dades coincident. Entenem el concepte amb la figura que es mostra a continuació:

Sobrecàrrega del mètode Java amb la promoció de tipus

Tal com es mostra al diagrama anterior, el byte es pot ascendir a curt, int, llarg, flotant o doble. El tipus de dades curt es pot promocionar a int, long, float o double. El tipus de dades char es pot promocionar a int, long, float o double i així successivament.

Exemple de sobrecàrrega de mètodes amb 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); } } 
Prova-ho ara
 Output:40 60 

Exemple de sobrecàrrega de mètodes amb una promoció de tipus si es troba coincident

Si hi ha arguments de tipus coincidents al mètode, la promoció de tipus no es realitza.

 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 } } 
Prova-ho ara
 Output:int arg method invoked 

Exemple de sobrecàrrega de mètodes amb promoció de tipus en cas d'ambigüitat

Si no hi ha arguments de tipus coincidents al mètode, i cada mètode promou un nombre similar d'arguments, hi haurà ambigüitat.

 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 } } 
Prova-ho ara
 Output:Compile Time Error 

Un tipus no es despromociona implícitament, per exemple, double no es pot despromocionar a cap tipus implícitament.