Preťaženie metódy v jazyku Java
Preťaženie metód v jazyku Java umožňuje rôznym metódam mať rovnaký názov, ale rôzne podpisy, pričom podpis sa môže líšiť počtom vstupných parametrov alebo typom vstupných parametrov alebo kombináciou oboch.
Preťaženie metód v jazyku Java je tiež známe ako Polymorfizmus v čase kompilácie , Statický polymorfizmus, príp Skorá väzba . Pri preťažení metódy v porovnaní s nadradeným argumentom bude mať podriadený argument najvyššiu prioritu.
Príklad preťaženia metódy
Java
// Java program to demonstrate working of method> // overloading in Java> > public> class> Sum {> > // Overloaded sum(). This sum takes two int parameters> > public> int> sum(> int> x,> int> y) {> return> (x + y); }> > > // Overloaded sum(). This sum takes three int parameters> > public> int> sum(> int> x,> int> y,> int> z)> > {> > return> (x + y + z);> > }> > > // Overloaded sum(). This sum takes two double> > // parameters> > public> double> sum(> double> x,> double> y)> > {> > return> (x + y);> > }> > > // Driver code> > public> static> void> main(String args[])> > {> > Sum s => new> Sum();> > System.out.println(s.sum(> 10> ,> 20> ));> > System.out.println(s.sum(> 10> ,> 20> ,> 30> ));> > System.out.println(s.sum(> 10.5> ,> 20.5> ));> > }> }> |
Výkon
30 60 31.0
Rôzne spôsoby preťaženia metód v jazyku Java
- Zmena počtu parametrov.
- Zmena dátových typov argumentov.
- Zmena poradia parametrov metód
1. Zmena počtu parametrov
Preťaženie metódy možno dosiahnuť zmenou počtu parametrov pri prechode na rôzne metódy.
Nižšie je uvedená implementácia vyššie uvedenej metódy:
Java
// Java Program to Illustrate Method Overloading> // By Changing the Number of Parameters> > // Importing required classes> import> java.io.*;> > // Class 1> // Helper class> class> Product {> > // Method 1> > // Multiplying two integer values> > public> int> multiply(> int> a,> int> b)> > {> > int> prod = a * b;> > return> prod;> > }> > > // Method 2> > // Multiplying three integer values> > public> int> multiply(> int> a,> int> b,> int> c)> > {> > int> prod = a * b * c;> > return> prod;> > }> }> > // Class 2> // Main class> class> GFG {> > // Main driver method> > public> static> void> main(String[] args)> > {> > // Creating object of above class inside main()> > // method> > Product ob => new> Product();> > > // Calling method to Multiply 2 numbers> > int> prod1 = ob.multiply(> 1> ,> 2> );> > > // Printing Product of 2 numbers> > System.out.println(> > 'Product of the two integer value :'> + prod1);> > > // Calling method to multiply 3 numbers> > int> prod2 = ob.multiply(> 1> ,> 2> ,> 3> );> > > // Printing product of 3 numbers> > System.out.println(> > 'Product of the three integer value :'> + prod2);> > }> }> |
Výkon
Product of the two integer value :2 Product of the three integer value :6
2. Zmena dátových typov argumentov
V mnohých prípadoch možno metódy považovať za preťažené, ak majú rovnaký názov, ale majú rôzne typy parametrov, metódy sa považujú za preťažené.
Nižšie je uvedená implementácia vyššie uvedenej metódy:
Java
// Java Program to Illustrate Method Overloading> // By Changing Data Types of the Parameters> > // Importing required classes> import> java.io.*;> > // Class 1> // Helper class> class> Product {> > // Multiplying three integer values> > public> int> Prod(> int> a,> int> b,> int> c)> > {> > int> prod1 = a * b * c;> > return> prod1;> > }> > > // Multiplying three double values.> > public> double> Prod(> double> a,> double> b,> double> c)> > {> > double> prod2 = a * b * c;> > return> prod2;> > }> }> > class> GFG {> > public> static> void> main(String[] args)> > {> > Product obj => new> Product();> > > int> prod1 = obj.Prod(> 1> ,> 2> ,> 3> );> > System.out.println(> > 'Product of the three integer value :'> + prod1);> > > double> prod2 = obj.Prod(> 1.0> ,> 2.0> ,> 3.0> );> > System.out.println(> > 'Product of the three double value :'> + prod2);> > }> }> |
Výkon
Product of the three integer value :6 Product of the three double value :6.0
3. Zmena poradia parametrov metód
Preťaženie metódy možno realizovať aj preskupením parametrov dvoch alebo viacerých preťažených metód. Napríklad, ak parametre metódy 1 sú (názov reťazca, int roll_no) a druhá metóda je (int roll_no, názov reťazca), ale obe majú rovnaký názov, potom sa tieto 2 metódy považujú za preťažené rôznymi postupnosťami parametrov. .
Nižšie je uvedená implementácia vyššie uvedenej metódy:
Java
// Java Program to Illustrate Method Overloading> // By changing the Order of the Parameters> > // Importing required classes> import> java.io.*;> > // Class 1> // Helper class> class> Student {> > // Method 1> > public> void> StudentId(String name,> int> roll_no)> > {> > System.out.println(> 'Name :'> + name +> ' '> > +> 'Roll-No :'> + roll_no);> > }> > > // Method 2> > public> void> StudentId(> int> roll_no, String name)> > {> > // Again printing name and id of person> > System.out.println(> 'Roll-No :'> + roll_no +> ' '> > +> 'Name :'> + name);> > }> }> > // Class 2> // Main class> class> GFG {> > // Main function> > public> static> void> main(String[] args)> > {> > // Creating object of above class> > Student obj => new> Student();> > > // Passing name and id> > // Note: Reversing order> > obj.StudentId(> 'Spyd3r'> ,> 1> );> > obj.StudentId(> 2> ,> 'Kamlesh'> );> > }> }> |
Výkon
Name :Spyd3r Roll-No :1 Roll-No :2 Name :Kamlesh
Čo ak sa presný prototyp nezhoduje s argumentmi?
Prioritne kompilátor vykoná tieto kroky:
- Typ Konverzia, ale na vyšší typ (v zmysle rozsahu) v rovnakej rodine.
- Zadajte konverziu na najbližšiu vyššiu rodinu (predpokladajme, že ak nie je k dispozícii dlhý typ údajov pre typ údajov int, potom sa vyhľadá typ údajov float).
Uveďme si príklad na objasnenie pojmu:
Java
// Demo Class> class> Demo {> > public> void> show(> int> x)> > {> > System.out.println(> 'In int'> + x);> > }> > public> void> show(String s)> > {> > System.out.println(> 'In String'> + s);> > }> > public> void> show(> byte> b)> > {> > System.out.println(> 'In byte'> + b);> > }> }> > class> UseDemo {> > public> static> void> main(String[] args)> > {> > byte> a => 25> ;> > Demo obj => new> Demo();> > > // it will go to> > // byte argument> > obj.show(a);> > > // String> > obj.show(> 'hello'> );> > > // Int> > obj.show(> 250> );> > > // Since char is> > // not available, so the datatype> > // higher than char in terms of> > // range is int.> > obj.show(> 'A'> );> > > // String> > obj.show(> 'A'> );> > > // since float datatype> > // is not available and so it's higher> > // datatype, so at this step their> > // will be an error.> > obj.show(> 7.5> );> > }> }> |
Výkon
./UseDemo.java:46: error: no suitable method found for show(double) obj.show(7.5); ^ method Demo.show(int) is not applicable (argument mismatch; possible lossy conversion from double to int) method Demo.show(String) is not applicable (argument mismatch; double cannot be converted to String) method Demo.show(byte) is not applicable (argument mismatch; possible lossy conversion from double to byte) 1 error
Výhody preťaženia metódy
- Preťaženie metódy zlepšuje čitateľnosť a opätovnú použiteľnosť programu.
- Preťaženie metódy znižuje zložitosť programu.
- Pomocou preťaženia metód môžu programátori vykonávať úlohu efektívne a efektívne.
- Pomocou preťažovania metód je možné pristupovať k metódam vykonávajúcim súvisiace funkcie s mierne odlišnými argumentmi a typmi.
- Objekty triedy môžu byť tiež inicializované rôznymi spôsobmi pomocou konštruktorov.
Dôležité otázky v jazyku Java
Q1. Môžeme preťažiť statické metódy?
odpoveď:
Odpoveď je ' Áno '. Môžeme mať dve alebo viac statických metód s rovnakým názvom, ale rozdielmi vo vstupných parametroch. Zvážte napríklad nasledujúci program Java. Ak sa chcete o tom dozvedieť viac, prečítajte si článok - Môžeme preťažiť alebo prepísať statické metódy v jazyku Java?
Q2. Môžeme preťažiť metódy, ktoré sa líšia iba statickými kľúčovými slovami?
odpoveď:
my nemôže preťaženie dvoch metód v Jave, ak sa líšia iba statickým kľúčovým slovom (počet parametrov a typy parametrov sú rovnaké). Pozrite si napríklad nasledujúci program Java. Podrobnosti nájdete v tomto.
Q3. Môžeme preťažiť main() v Jave?
odpoveď:
Rovnako ako iné statické metódy, aj my môcť preťaženie main() v jazyku Java .
Java
// Java program with overloaded main()>import>java.io.*;>>public>class>Test {>>// Normal main()>>public>static>void>main(String[] args)>>{>>System.out.println(>'Hi Geek (from main)'>);>>Test.main(>'Geek'>);>>}>>>// Overloaded main methods>>public>static>void>main(String arg1)>>{>>System.out.println(>'Hi, '>+ arg1);>>Test.main(>'Dear Geek'>,>'My Geek'>);>>}>>>public>static>void>main(String arg1, String arg2)>>{>>System.out.println(>'Hi, '>+ arg1 +>', '>+ arg2);>>}>}>
Výkon
Hi Geek (from main) Hi, Geek Hi, Dear Geek, My Geek
Q4. Podporuje Java preťaženie operátora?
odpoveď:
Na rozdiel od C++ Java neumožňuje používateľom definované preťažené operátory. Interne Java preťažuje operátory, napríklad + je preťažené pre zreťazenie.
Q5. Môžeme preťažiť metódy na návratovom type?
odpoveď:
Nemôžeme preťažiť návratovým typom. Toto správanie je rovnaké v C++. Podrobnosti nájdete v tomto.
Java
/*package whatever //do not write package name here */>>import>java.io.*;>>public>class>Main {>>public>int>foo() {>return>10>; }>>>// compiler error: foo() is already defined>>public>char>foo() {>return>'a'>; }>>>public>static>void>main(String args[]) {}>}>
Chyba
./Main.java:8: error: method foo() is already defined in class Main public char foo() { return 'a'; } ^ 1 errorMetódy Overloading na návratovom type sú však možné v prípadoch, keď je explicitne špecifikovaný dátový typ volanej funkcie. Pozrite si príklady nižšie:
Java
// Java program to demonstrate the working of method>// overloading in static methods>>import>java.io.*;>>public>class>Main {>>>public>static>int>foo(>int>a) {>return>10>; }>>public>static>char>foo(>int>a,>int>b) {>return>'a'>; }>>>public>static>void>main(String args[])>>{>>System.out.println(foo(>1>));>>System.out.println(foo(>1>,>2>));>>}>}>
Výkon
10 aJava
// Java program to demonstrate working of method>// overloading in methods>class>A {>>public>int>foo(>int>a) {>return>10>; }>>>public>char>foo(>int>a,>int>b) {>return>'a'>; }>}>>public>class>Main {>>>public>static>void>main(String args[])>>{>>A a =>new>A();>>System.out.println(a.foo(>1>));>>System.out.println(a.foo(>1>,>2>));>>}>}>
Výkon
10 a
Q6. Aký je rozdiel medzi preťažením a prepísaním?
odpoveď:
Preťaženie je približne rovnaká funkcia s rôznymi podpismi. Prvoradé je o rovnakej funkcii a rovnakom podpise, ale o rôznych triedach spojených prostredníctvom dedenia.
![]()
Preťaženie je príkladom polymorfizmu času kompilátora a prepisovanie je príkladom polymorfizmu času behu.
Súvisiace články
- Rôzne spôsoby preťaženia metód v jazyku Java
- Preťaženie metódy a chyba Null v jazyku Java
- Môžeme preťažiť alebo prepísať statické metódy v jave?