- Diferents maneres de sobrecarregar el mètode
- En canviar el núm. d'arguments
- En canviar el tipus de dades
- Per què la sobrecàrrega del mètode no és possible canviant el tipus de retorn
- Podem sobrecarregar el mètode principal
- 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.
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
- Canviant el nombre d'arguments
- 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ó:
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