JavaRush /Java blogi /Random-UZ /Bu va Java'dagi super kalit so'zlar o'rtasidagi farq
grishin
Daraja
Харьков

Bu va Java'dagi super kalit so'zlar o'rtasidagi farq

Guruhda nashr etilgan
thisva superJava tilidagi ikkita maxsus kalit so'zlar mos ravishda sinf va uning yuqori sinfining joriy nusxasini ifodalaydi. Java dasturchilari ko'pincha bu so'zlarni chalkashtirib yuborishadi va ularning Java Core intervyularida tez-tez so'raladigan maxsus xususiyatlari haqida kam ma'lumotga ega. Misol uchun, darhol xayolga keladigan bir nechta savollar thisva haqida bo'ladi, Java tilida superkalit so'zga boshqa ma'no berish mumkinmi ? va kalit so'zlar va Java thiso'rtasidagi farq nima . Bilmayman? Xo'sh, men bu erda javob bermayman - uni maqolaning oxirida topish mumkin. Shunday qilib, boshida aytib o'tganimdek, Java-dan asosiy farq shundaki , sinfning joriy nusxasi, ota-klassning joriy nusxasi esa ifodalaydi. Mana, o'zgaruvchilardan foydalanishning bir misoli va - ehtimol siz birining konstruktorlarini boshqasidan chaqirish misollarini ko'rgansiz, deb atalmish. konstruktorlarni zanjirda chaqirish, bu kalit so'zlardan foydalanish orqali mumkin va . Sinf ichida argumentsiz konstruktorni chaqirish uchun ishlatiladi , u argumentsiz konstruktorni chaqirish uchun ishlatiladi yoki u ham deyiladi, ota-klassning standart konstruktori. Aytgancha, shu tarzda siz faqat argumentlarsiz konstruktorni emas, balki unga mos parametrlarni o'tkazish orqali boshqa istalgan konstruktorni ham chaqirishingiz mumkin. Tez orada bu foydalanish misolini ko'ramiz . Shuningdek, Java -da ular sinf namunasi va uning ota-onasining o'zgaruvchilariga kirish uchun ishlatiladi. Aslida, ularga va prefikslarisiz kirish mumkin , lekin joriy blokda bunday o'zgaruvchilar boshqa o'zgaruvchilar bilan bir-biriga mos kelmasa, ya'ni. agar unda bir xil nomli mahalliy o'zgaruvchilar bo'lmasa, aks holda siz prefiksli nomlardan foydalanishingiz kerak bo'ladi, lekin bu muhim emas, chunki bu shaklda ular yanada o'qilishi mumkin. Ushbu yondashuvning klassik namunasi uni misol o'zgaruvchisi bilan bir xil nomga ega parametrni qabul qiluvchi konstruktor ichida ishlatishdir . Keyinchalik maqolada va o'rtasida yana qanday farqlar borligini bilib olamiz va ulardan foydalanishning ba'zi misollarini ko'rib chiqamiz. thissuperBu va Java-dagi super kalit so'zlar o'rtasidagi farq - 1thissuperthissuperthissuperthissuperthis()super()thissuperthissupersuperthisthissuperthis

Bu va super qanday o'xshash

thisKalit so'zlar va kalit so'zlar o'rtasidagi farqlarni ko'rib chiqishdan oldin super, ularning ba'zi o'xshashliklarini ko'rib chiqaylik:
  1. this, va ikkalasi superham statik bo'lmagan o'zgaruvchilardir, shuning uchun ularni statik kontekstda ishlatib bo'lmaydi, ya'ni ularni asosiy usulda ishlatib bo'lmaydi. Bu kompilyatsiya vaqtida xatolikka olib keladi "statik bo'lmagan o'zgaruvchiga thisstatik kontekstdan havola qilish mumkin emas". Agar kalit so'zni asosiy usulda ishlatsangiz, xuddi shu narsa sodir bo'ladi super.

  2. Har ikkisi thisva superkonstruktorlar ichida zanjirdagi boshqa konstruktorlarni chaqirish uchun ishlatilishi mumkin, masalan, this() va super() mos ravishda meros va ota-sinflar argumentlarisiz konstruktorni chaqirish.
Quyidagi misolda biz birinchi navbatda B sinfidagi argumentsiz konstruktordan bitta turdagi parametrni qabul qiluvchi bir xil B sinfidagi konstruktorga qo'ng'iroqni o'tkazamiz String, bu esa o'z navbatida super("")supersinfdan bitta argumentli konstruktorni chaqiradi.
class A{

    A(){
        System.out.println("Конструктор без аргументов класса A");
    }

    A(String args){
        System.out.println("Конструктор с одним аргументом класса A");
    }
}

class B extends A{

   B(){
        this(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        System.out.println("Конструктор с одним аргументом класса B");
    }
}

// Тест-класс и вывод
public class Test {

    public static void main(String args[]) {
       B b = new B();
    }

}
Natija: A sinfining bitta argumentli konstruktori B sinfining bitta argumentli konstruktori B sinfining argumentsiz konstruktori
  1. Konstruktor ichida thisva superboshida barcha boshqa iboralar ustida paydo bo'lishi kerak, aks holda kompilyator xato xabarini chiqaradi. Bundan kelib chiqadiki, bitta konstruktor ikkala this()va ni o'z ichiga olmaydi super().

Super va bu o'rtasidagi farqlar

Endi biz kalit so'zlardan qanday foydalanishni bilamiz superva thisular nima uchun kerakligini tushunamiz. Ammo men eslatib o'tmagan ushbu kalit so'zlardan foydalanishning yana bir varianti bor - ichki sinflarda, bu erda ularning yordami bilan Outer notation shaklidan foydalangan holda tashqi sinfga murojaat qilish juda qulay. thisuning joriy misoli va tashqi uchun. super- ota-onasi uchun. Outerni tashqi sinf nomi bilan almashtirishni unutmang. thisEndi kalit so'zlar va kalit so'zlar o'rtasidagi asosiy farqlarni qisqacha sanab o'tamizsuper
  1. o'zgaruvchi o'zi thisishlatilayotgan sinfning joriy namunasiga ishora qiladi, holbuki u superota-sinfning joriy namunasiga ishora qiladi.

  2. Har bir konstruktor, boshqa konstruktorlarga aniq qo'ng'iroqlar bo'lmasa, super()o'z ota-klassining argumentsiz konstruktorini bilvosita chaqiradi, lekin sizda har doim boshqa har qanday konstruktorni this()yoki bilan aniq qo'ng'iroq qilish imkoniyati mavjud super().
thisBu, ehtimol, kalit so'zlar va superJava o'rtasidagi farqlar va ularning dasturlarda qanday ishlatilishi haqida aytilishi mumkin bo'lgan narsadir . Ko'rib turganimizdek, ularning asosiy maqsadi bir konstruktorni boshqasidan chaqirish va joriy sinf va uning ota-klassida e'lon qilingan misol o'zgaruvchilariga murojaat qilishdir. Shuni unutmangki, bu oddiy o'zgaruvchilar emas va endi - birinchi xatboshida so'ragan savolimga javob. Yo'q, o'zgaruvchiga thisyangi qiymat berish mumkin emas, chunki u yakuniy deb e'lon qilingan. Buni IDE-da bajarishga urinib ko'rishingiz mumkin - siz kompilyatsiya xatosini olasiz "siz o'zgaruvchiga yangi qiymat bera olmaysiz this- u yakuniy deb e'lon qilingan." Asl maqola bu yerda .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION