logo

Metodo perkrovimas Java

Java programoje Method Overloading leidžia skirtingiems metodams turėti tą patį pavadinimą, bet skirtingus parašus, kai parašas gali skirtis pagal įvesties parametrų skaičių arba įvesties parametrų tipą arba abiejų mišinį.

Metodo perkrovimas Java taip pat žinomas kaip Kompiliavimo laiko polimorfizmas , Statinis polimorfizmas arba Ankstyvas įrišimas . Metodo perkrovimas, palyginti su pagrindiniu argumentu, antrinis argumentas bus teikiamas aukščiausią prioritetą.



Metodo perkrovos pavyzdys

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>));> >}> }>



>

dvejetainis medis java

>

Išvestis

30 60 31.0>

Įvairūs „Java“ metodų perkrovimo būdai

  • Parametrų skaičiaus keitimas.
  • Argumentų duomenų tipų keitimas.
  • Metodų parametrų eilės keitimas

1. Parametrų skaičiaus keitimas

Metodo perkrovimas gali būti pasiektas keičiant parametrų skaičių pereinant prie skirtingų metodų.

Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:

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);> >}> }>

>

>

Išvestis

Product of the two integer value :2 Product of the three integer value :6>

2. Argumentų duomenų tipų keitimas

Daugeliu atvejų metodai gali būti laikomi perkrautais, jei jie turi tą patį pavadinimą, bet turi skirtingus parametrų tipus, metodai laikomi perkrautais.

Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:

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);> >}> }>

>

>

Išvestis

Product of the three integer value :6 Product of the three double value :6.0>

3. Metodų parametrų eilės keitimas

Metodo perkrovimas taip pat gali būti įgyvendintas pertvarkant dviejų ar daugiau perkrautų metodų parametrus. Pavyzdžiui, jei 1 metodo parametrai yra (Eilutės pavadinimas, int roll_no), o kitas metodas yra (int roll_no, String name), bet abu turi tą patį pavadinimą, šie 2 metodai laikomi perkrautais skirtingomis parametrų sekomis. .

Žemiau pateikiamas pirmiau minėto metodo įgyvendinimas:

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'>);> >}> }>

>

>

Išvestis

Name :Spyd3r Roll-No :1 Roll-No :2 Name :Kamlesh>

Ką daryti, jei tikslus prototipas nesutampa su argumentais?

Pagal prioritetą kompiliatorius atlieka šiuos veiksmus:

  • Įveskite konversiją, bet į aukštesnį tipą (pagal diapazoną) toje pačioje šeimoje.
  • Įveskite konversiją į kitą aukštesnę šeimą (tarkime, jei nėra ilgo duomenų tipo int duomenų tipui, jis ieškos slankiojo duomenų tipo).
Įveskite Conversion Java

Paimkime pavyzdį, kad paaiškintume sąvoką:

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>);> >}> }>

>

>

Išvestis

./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>

Metodo perkrovos privalumai

  • Metodo perkrovimas pagerina programos skaitomumą ir pakartotinį naudojimą.
  • Metodo perkrovimas sumažina programos sudėtingumą.
  • Naudodami metodo perkrovą, programuotojai gali efektyviai ir efektyviai atlikti užduotį.
  • Naudojant metodų perkrovimą, galima pasiekti metodus, atliekančius susijusias funkcijas su šiek tiek skirtingais argumentais ir tipais.
  • Klasės objektai taip pat gali būti inicijuojami įvairiais būdais naudojant konstruktorius.

Svarbūs klausimai Java

Q1. Ar galime perkrauti statinius metodus?

Atsakymas:

Atsakymas yra ' Taip “. Galime turėti du ar daugiau statinių metodų tuo pačiu pavadinimu, tačiau įvesties parametrai skiriasi. Pavyzdžiui, apsvarstykite šią „Java“ programą. Norėdami sužinoti daugiau apie tai, skaitykite straipsnį - Ar galime perkrauti arba nepaisyti statinių metodų „Java“?

Q2. Ar galime perkrauti metodus, kurie skiriasi tik statiniais raktiniais žodžiais?

Atsakymas:

Mes negali perkrauti du metodus Java, jei jie skiriasi tik statiniu raktiniu žodžiu (parametrų skaičius ir parametrų tipai yra vienodi). Pavyzdžiui, žiūrėkite šią „Java“ programą. Daugiau informacijos rasite čia.

Q3. Ar galime perkrauti main() Java?

Atsakymas:

Kaip ir kiti statiniai metodai, mes gali perkrauti main() 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);> >}> }>

>

>

Išvestis

Hi Geek (from main) Hi, Geek Hi, Dear Geek, My Geek>

4 klausimas. Ar „Java“ palaiko operatoriaus perkrovą?

Atsakymas:

Skirtingai nei C++, Java neleidžia vartotojo apibrėžtų perkrautų operatorių. „Java“ viduje perkrauna operatorius, pavyzdžiui, + yra perkrautas sujungimui.

Q5. Ar galime perkrauti grąžinimo tipo metodus?

Atsakymas:

Negalime perkrauti pagal grąžinimo tipą. Šis elgesys yra toks pat ir C++. Daugiau informacijos rasite čia.

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[]) {}> }>

>

>

Klaida

./Main.java:8: error: method foo() is already defined in class Main public char foo() { return 'a'; } ^ 1 error>

Tačiau grąžinimo tipo perkrovos metodai galimi tais atvejais, kai yra aiškiai nurodytas iškviečiamos funkcijos duomenų tipas. Pažvelkite į toliau pateiktus pavyzdžius:

laikotarpio raktas

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>));> >}> }>

>

>

Išvestis

10 a>

Java




// 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>));> >}> }>

>

>

Išvestis

10 a>

6 klausimas. Kuo skiriasi perkrovimas ir nepaisymas?

Atsakymas:

Perkrovimas yra maždaug ta pati funkcija, turinti skirtingus parašus. Nepaisymas yra maždaug ta pati funkcija ir tas pats parašas, bet skirtingos klasės, sujungtos per paveldėjimą.

„Java“ perkrovimas ir nepaisymas

Perkrovimas yra kompiliatoriaus laiko polimorfizmo pavyzdys, o nepaisymas yra vykdymo laiko polimorfizmo pavyzdys.

susiję straipsniai

  • Įvairūs „Java“ metodo perkrovimo būdai
  • „Java“ metodo perkrovimas ir nulinė klaida
  • Ar galime perkrauti arba nepaisyti statinių metodų Java?