— Բարև, Ամիգո՛։ Երկու օր առաջ քեզ պատմել էի մեթոդների վերաբեռնավորման մասին։ Դու ամեն ինչ հասկացա՞ր:
— Այո։ Հիշում եմ։ Յուրաքանչյուր դասի մեթոդը պետք է լինի յուրահատուկ։ Դասի մեթոդը յուրահատուկ է, եթե այդ դասում չկա մեթոդ նույն անվանմամբ և պարամետրերի տիպով, որտեղ պարամետրերի կարգը կարևոր է։
— Հիանալի է։ Տեսնում եմ, որ լավ սովորել ես այն դասը։ Այսօր ուզում եմ ընդամենը մի փոքր ընդլայնել քո գիտելիքները։ Ինչ ես կարծում, որ մեթոդը կկոչվի յուրաքանչյուր դեպքում:
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 կոդ | Նկարագրություն |
---|---|
|
Առաջին դեպքում int-ը կգտնի մինչև Integer, իսկ եթե չկա մեթոդ Integer-ի համար, ապա կոչվելու է համապատասխան մեթոդը, այսինքն՝ void print(Object o) Երկրորդ դեպքում, կոմպիլատորի սխալ չի լինի և կկոչվի մեթոդը void print(String s) ինչը մի քիչ ոչ ակնհայտ է։ |
— Հույս ունեմ, Ամիգո, որ հասկացել ես, որ նման դեպքերում ավելի լավ է նշել տիպի փոխարկման օպերատորը, ինչպես (byte) դեպքում, որ ճիշտ գիտենաս, որն է մեթոդը որ կկոչվի։
— Ոչինչ չեմ սպասել մեթոդների վերաբեռնավորումից։ Եվ այստեղ՝ քեզ վրա։ Շնորհակալություն, Ռիշա, ուշադիր կլինեմ և չթուլանամ։
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ