JavaRush-da talabalar birinchi ma'ruzalardan boshlab kalit so'z bilan tanishadilar
va ma'lum bo'lishicha, siz ushbu usuldan o'zgaruvchiga shunchaki qiymat berasiz
Ya'ni,
Va quyida kalit so'z bilan dastur kodi
this
. Va vaqt o'tishi bilan bu nimani anglatishini aniqlaydi. Ammo ko'pchilik, orqaga qarab, uzoq vaqt davomida ushbu kalit so'zning zenini anglay olmaganliklarini o'zlariga halol aytishadi. this
Ushbu maqolada biz hali ham buni tushuna olmaganlar uchun kalit so'zlardan foydalanish sirlari pardasini ko'taramiz ... Xush kelibsiz! Agar siz Shildtning Java ma'lumotnomasini olsangiz , 171-betda siz kalit so'z this
zarurligini o'qiysiz, shunda usul uni chaqirgan ob'ektga murojaat qilishi mumkin. Bu aslida uning oxiri bo'lishi mumkin. Ammo bizga aniq ma'lumotlar kerak. Qoida tariqasida, u ikki holatdathis
qo'llanilishi kerak :
- Sinf namunasi o'zgaruvchisi va metod/konstruktor o'zgaruvchisi bir xil nomga ega bo'lsa;
- Bir turdagi konstruktorni (masalan, standart yoki parametrlangan konstruktor) boshqasidan chaqirish kerak bo'lganda. Bu aniq konstruktor chaqiruvi deb ham ataladi.
Birinchi misol - misol o'zgaruvchisi va usul o'zgaruvchisi bir xil nomga ega
Aytaylik, bizdaHuman
"nom" maydoni aniqlangan sinf mavjud: O'zgaruvchi uchun setter yarataylik name
(sozlovchi yaxshi ishlaydi va bu erda hech qanday hiyla yo'q): Iltimos, biz o'zgaruvchini metodga (setter) o'tkazayotganimizni unutmang. ) . Biz yangi o'zgaruvchini kiritdik va (umuman) uni xohlagan narsamiz deb atashimiz mumkin edi, chunki u faqat usulning {jingalak qavslari} ichida ko'rinadi . E'tibor bering, sozlagichda bitta qator mavjud: setName
String newName
setName
name = newName;
Ya'ni, aslida biz yangi o'zgaruvchini kiritdik newName
va uni sinfda mavjud bo'lgan o'zgaruvchiga tayinladik name
. Ko'pgina dasturchilar, agar oxirida biz xuddi shu narsa haqida gapiradigan bo'lsak, o'zgaruvchini yangi nom bilan kiritish g'alati tuyuldi. Sinfdagi ism haqida Human
. Shu sababli, til ishlab chiquvchilari bitta o'zgaruvchining nomidan foydalanishni qulay qilish haqida o'ylashdi. Boshqacha qilib aytganda, nima uchun bir xil ma'noni anglatuvchi o'zgaruvchining ikkita nomi bor? Ya'ni, men shunday qilmoqchiman: Lekin bu holda muammo paydo bo'ladi . Endi bizda bir xil nomlangan ikkita o'zgaruvchi bor. Biri String name
sinfga Human
, ikkinchisi esa String name
uning uslubiga tegishli setName
. Shuning uchun, Java mashinasi setterda satr yozganingizda qaysi o'zgaruvchini nazarda tutayotganingizni bilmaydi:
name = name;
Java eng yaqinini - name
usuldan oladi setName
:
name
, unga. Bu, albatta, hech qanday ma'noga ega emas. Shuning uchun, o'zgaruvchini name
sinfdan Human
o'zgaruvchidan name
metoddan ajratish uchun qandaydir yo'l kerak edi.Bu setName
muammoni hal qilish uchun kalit so'z kiritildi this
, bu holda bu o'zgaruvchini usul emas, balki o'zgaruvchini chaqirish kerakligini ko'rsatadi. sinfdan Human
:
this
maqolaning boshida aytib o'tilganidek, u chaqiruvchi ob'ektga murojaat qiladi. Natijada, yaratilgan ob'ektga sozlagich orqali shaxsning nomi setName
o'rnatiladi. Quyida kalit so'zni ishlatmasdan kod mavjud this
. Kod sinf ob'ektini yaratadi Human
va unga nom beradi:
this
:
public class Solution{
public static void main(String[] args) {
Human human1 = new Human();
human1.setName("Volodya");
human1.print();
}
}
class Human{
String name;
public String getName() {
return name;
}
public void setName(String name){
this.name = name;
}
void print(){
System.out.println(name);
}
}
Shunday qilib, u this
bir xil narsani belgilash uchun yangi o'zgaruvchilarni kiritishdan qochadi, bu esa kodni qo'shimcha o'zgaruvchilar bilan kamroq "ortiqcha yuklangan" qiladi.
Ikkinchi misol - bu konstruktorni aniq chaqirish uchun foydalanish
Bir konstruktorni boshqasidan chaqirish, agar sizda (g'alati) bir nechta konstruktorlar mavjud bo'lsa va siz konstruktorda ilgari berilgan ishga tushirish kodini yangi konstruktorda qayta yozishni xohlamasangiz foydali bo'lishi mumkin. Adashib qoldingizmi? Hamma narsa ko'rinadigan darajada qo'rqinchli emas. Quyidagi kodga qarang, u ikkita sinf konstruktoriga egaHuman
:
class Human{
int age;
int weight;
int height;
Human(int age, int weight){
this.age = age;
this.weight = weight;
}
Human(int age, int weight, int height){
//you call the constructor with two parameters
this(age, weight);
//and add the missing variable
this.height = height;
}
}
int age
Bu erda bizda birinchi navbatda va qabul qiluvchi ikki parametrli konstruktor mavjud int weight
. Aytaylik, biz unda ikkita qator kod yozdik:
this.age = age;
this.weight = weight;
va keyin ular yana bir konstruktorni qo'shishga qaror qilishdi, uchta parametrga ega, bu yosh va vazndan tashqari, balandlikni ham oladi. Yangi konstruktorda buni yozishingiz mumkin:
this.age = age;
this.weight = weight;
this.height = height;
Biroq, ushbu konstruktorda allaqachon yozgan kodni takrorlash o'rniga, this
ikkita parametr bilan konstruktorni aniq chaqirish uchun kalit so'zdan foydalanishingiz mumkin:
this(age, weight);
// and add the missing variable:
this.height = height;
Shunday qilib, siz konstruktorga uchta parametrni aytasiz:
- ikkita parametrga ega bo'lgan ushbu konstruktorni chaqiring.
- va etishmayotgan o'zgaruvchini qo'shing.
this
statiklardan tashqari barcha usullarga uzatiladi (shuning uchun u this
ko'pincha yashirin parametr deb ataladi) va usul deb ataladigan ob'ektga murojaat qilish uchun ishlatilishi mumkin. Bu kalit so'zdan qo'rqishning hojati yo'q, chunki This
u qo'rqinchli emas.
GO TO FULL VERSION