JavaRush /Курсы /All lectures for AM purposes /Մեթոդների վերաբեռնավորում | մաս 2

Մեթոդների վերաբեռնավորում | մաս 2

All lectures for AM purposes
1 уровень , 172 лекция
Открыта

— Բարև, Ամիգո՛։ Երկու օր առաջ քեզ պատմել էի մեթոդների վերաբեռնավորման մասին։ Դու ամեն ինչ հասկացա՞ր:

— Այո։ Հիշում եմ։ Յուրաքանչյուր դասի մեթոդը պետք է լինի յուրահատուկ։ Դասի մեթոդը յուրահատուկ է, եթե այդ դասում չկա մեթոդ նույն անվանմամբ և պարամետրերի տիպով, որտեղ պարամետրերի կարգը կարևոր է։ 

— Հիանալի է։ Տեսնում եմ, որ լավ սովորել ես այն դասը։ Այսօր ուզում եմ ընդամենը մի փոքր ընդլայնել քո գիտելիքները։ Ինչ ես կարծում, որ մեթոդը կկոչվի յուրաքանչյուր դեպքում:

Կոդ
class Cat
{
 public static void print(int n)
 {
  System.out.println(n);
 }
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }
 public static void print(String s)
 {
  System.out.println(s);
 } 
public static void main(String[] args)
{
  Cat.print(1);
  Cat.print((byte)1);
  Cat.print("1");
  Cat.print(null);
 }
}

— Դժվարանում եմ պատասխանել։

— Առաջին դեպքում 1-ն ունի int տիպ, և մենք ունենք 100% համընկնում մեթոդի հետ, որը ընդունում է int։ Կկոչվի առաջին void print(int n).

Երկրորդ դեպքում, byte-ը համընկնող մեթոդ չունի։ Բայց մենք ունենք երկու մեթոդ, որոնք ընդունում են short և int։ Տիպերի ընդլայնման ստանդարտով, byte-ը նախ կգտնի մինչև short, իսկ հետո կգտնի մինչև int։ Վերջաբեռ - կկոչվի մեթոդը void print(short n).

Երրորդ դեպքում մենք ունենք 100% համընկնում մեթոդի հետ, որը ընդունում է String։ Կկոչվի մեթոդը void print(String s).

Չորրորդ դեպքում ունենք անորոշություն։ null-ը չունի որոշակի տիպ, կոմպիլատորը կմերժի այս կոդը կոմպիլացնել։ Այդ դեպքում պետք է գրել Cat.print((Integer)null), որպեսզի կոչվի երրորդ մեթոդը և Cat.print((String)null), որպեսզի կոչվի չորրորդը։

— Շատ ուսուցողական էր, Շնորհակալություն։

— Ուշադրություն եմ դարձնում, որ մեթոդի ընտրության գործընթացում տիպերը կարող են միայն ընդլայնվել, ոչ թե նեղանալ։ Օրինակ՝

Կոդ
class Cat
{
 public static void print(short n)
 {
  System.out.println(n);
 }
 public static void print(Integer n)
 {
  System.out.println(n);
 }

 public static void main(String[] args)
 {
  Cat.print((byte)1);
  Cat.print(1);
 }
}

Առաջին դեպքում byte տիպը կգտնի մինչև short և կկոչվի առաջին մեթոդը՝ void print(short n).

Երկրորդ դեպքում ոչըստակորեն կկատարվի int-ից մինչև Integer ստի պահանջվող փոխարկում, և կկոչվի երկրորդ մեթոդը՝ void print(Integer n).

— Անսպասելի էր։

— Ոչ, անսպասելի է այստեղ՝

Java կոդ Նկարագրություն
 class Cat
{
 public static void print(Object o)
 {
  System.out.println(o);
 }
 public static void print(String s)
 {
  System.out.println(s);
 }

 public static void main(String[] args)
 {
  Cat.print(1);
  Cat.print(null);
 }
}
Առաջին դեպքում int-ը կգտնի մինչև Integer, իսկ եթե չկա մեթոդ Integer-ի համար, ապա կոչվելու է համապատասխան մեթոդը, այսինքն՝ void print(Object o)

Երկրորդ դեպքում, կոմպիլատորի սխալ չի լինի և կկոչվի մեթոդը void print(String s) ինչը մի քիչ ոչ ակնհայտ է։

— Հույս ունեմ, Ամիգո, որ հասկացել ես, որ նման դեպքերում ավելի լավ է նշել տիպի փոխարկման օպերատորը, ինչպես (byte) դեպքում, որ ճիշտ գիտենաս, որն է մեթոդը որ կկոչվի։

— Ոչինչ չեմ սպասել մեթոդների վերաբեռնավորումից։ Եվ այստեղ՝ քեզ վրա։ Շնորհակալություն, Ռիշա, ուշադիր կլինեմ և չթուլանամ։

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ