- Различити начини преоптерећења методе
- Променом бр. аргумената
- Променом типа података
- Зашто преоптерећење метода није могуће променом типа враћања
- Можемо ли преоптеретити главни метод
- преоптерећење метода промоцијом типа
Ако класа има више метода са истим именом, али различитим параметрима, познат је као Преоптерећење метода .
Ако морамо да извршимо само једну операцију, исто име метода повећава читљивост програм .
јава свинг туториал
Претпоставимо да морате да извршите сабирање датих бројева, али може постојати било који број аргумената, ако напишете метод као што је а(инт,инт) за два параметра и б(инт,инт,инт) за три параметра, онда је Вама, као и другим програмерима, може бити тешко да разумете понашање методе јер се њен назив разликује.
Дакле, вршимо преоптерећење метода да бисмо брзо схватили програм.
Предност преоптерећења метода
Преоптерећење метода повећава читљивост програма .
Различити начини преоптерећења методе
Постоје два начина за преоптерећење методе у Јави
- Променом броја аргумената
- Променом типа података
У Јави, преоптерећење метода није могуће само променом типа враћања методе.
1) Преоптерећење метода: промена бр. аргумената
У овом примеру смо креирали две методе, прва метода адд() врши сабирање два броја, а друга метода адд врши сабирање три броја.
У овом примеру ми стварамо статичке методе тако да не треба да креирамо инстанцу за позивање метода.
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)); }}Тестирајте одмах
Излаз:
22 33
2) Преоптерећење метода: промена типа података аргумената
У овом примеру смо креирали две методе које се разликују у Тестирајте одмах
Излаз:
22 24.9
П) Зашто преоптерећење метода није могуће само променом типа повратка методе?
У Јави, преоптерећење метода није могуће променом типа враћања методе само због двосмислености. Хајде да видимо како може доћи до двосмислености:
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 }}Тестирајте одмах
Излаз:
Compile Time Error: method add(int,int) is already defined in class Adder
Систем.оут.принтлн(Аддер.адд(11,11)); //Овде, како јава може да одреди који метод сум() треба позвати?
Напомена: Грешка у времену превођења је боља од грешке у времену извођења. Дакле, јава компајлер приказује временску грешку компајлера ако декларишете исти метод са истим параметрима.
Можемо ли преоптеретити јава маин() метод?
Да, преоптерећењем метода. Можете имати било који број главних метода у класи преоптерећењем метода. Али ЈВМ позива маин() метод који прима низ стрингова само као аргументе. Погледајмо једноставан пример:
ц случајни број
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');} }Тестирајте одмах
Излаз:
main with String[]
Преоптерећење метода и промоција типа
Један тип се имплицитно промовише у други ако се не пронађе одговарајући тип података. Хајде да разумемо концепт на слици датој испод:
Као што је приказано у горњем дијаграму, бајт се може унапредити у кратки, инт, дуги, плутајући или дупли. Кратки тип података може се унапредити у инт, лонг, флоат или доубле. Тип података цхар се може унапредити у инт, лонг, флоат или доубле и тако даље.
Пример преоптерећења метода помоћу ТипеПромотион
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); } }Тестирајте одмах
Output:40 60
Пример преоптерећења метода са промоцијом типа ако је пронађено подударање
Ако у методи постоје одговарајући аргументи типа, промоција типа се не врши.
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 } }Тестирајте одмах
Output:int arg method invoked
Пример преоптерећења метода са промоцијом типа у случају нејасноће
Ако у методи нема аргумената типа који се подудара, а сваки метод промовише сличан број аргумената, биће нејасноћа.
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 } }Тестирајте одмах
Output:Compile Time Error