JavaRush программасында студенттер ачкыч сөз менен биринчи лекциялардан эле таанышышат
Башкача айтканда,
Ал эми төмөндө ачкыч сөз менен программа codeу болуп саналат
this
. Ал эми убакыттын өтүшү менен бул эмнени билдирери айкын болуп калат. Бирок көптөр, артка кылчайып, чынчылдык менен, балким, узак убакыт бою бул негизги сөздүн зенин түшүнө алышкан жок деп айтышат. Бул макалада биз ачкыч сөздөрдү колдонууга байланыштуу сырлардын көшөгөсүн this
дагы эле түшүнө албагандар үчүн көтөрөбүз... Кош келиңиз! Эгер сиз Шилдттин Java маалымдама китебин алсаңыз , 171-беттен this
метод аны чакырган an objectке шилтеме кылуу үчүн ачкыч сөз керек экенин окуйсуз . Бул чындыгында анын аягы болушу мүмкүн. Бирок бизге конкреттүү маалыматтар керек. Эреже катары, this
ал эки учурда колдонулушу керек:
- Класс инстанциясынын өзгөрмөсү менен метод/конструктор өзгөрмө аты бирдей болгондо;
- Бир түрдөгү конструкторду (мисалы, демейки же параметрленген конструктор) башкасынан чакыруу керек болгондо. Бул ачык конструктор чалуу деп да аталат.
Биринчи мисал - инстанция өзгөрмө жана метод өзгөрмө бир аталышка ээ
Келгиле, биздеHuman
"аты" талаасы аныкталган класс бар дейли: Өзгөрмө үчүн орнотуучу түзөлү name
(жөндөөчү абдан иштеп жатат жана бул жерде эч кандай айла жок): Биз өзгөрмөнү методго өткөрүп жатканыбызды эске алыңыз (setter) ) . Биз жаңы өзгөрмө киргиздик жана (жалпысынан) аны каалаган нерсебиз деп атай алабыз, анткени ал методдун {тармал кашааларында} гана көрүнөт . Баса, орнотуучуда бир сызык бар: setName
String newName
setName
name = newName;
Башкача айтканда, биз жаңы өзгөрмө киргиздик newName
жана аны класста мурунтан эле бар өзгөрмөгө дайындадык name
. Көптөгөн программисттер, эгер акырында биз бир эле нерсе жөнүндө сөз кылсак, жаңы ат менен өзгөрмө киргизүү кызыктай деп ойлошкон. Класстагы аты жөнүндө Human
. Ошондуктан, тилди иштеп чыгуучулар бир өзгөрмө атын колдонууга ыңгайлуу кылууну ойлонушту. Башкача айтканда, эмне үчүн бир эле нерсени билдирген өзгөрмөнүн эки аты бар. Башкача айтканда, мен бул сыяктуу бир нерсе кылгым келет: Бирок бул учурда бир көйгөй пайда болот . Азыр бизде бирдей аталыштагы эки өзгөрмө бар. Бири String name
класска Human
, экинчиси String name
анын методуна кирет setName
. Демек, Java машинасы орнотуучуга сап жазганыңызда кайсы өзгөрмөнү айтаарыңызды билбейт:
name = name;
Java эң жакынын - name
ыкмадан алат setName
:
name
жана бул ыкмадан өзгөрмөгө жөн гана маани бересиз . Бул, албетте, эч кандай мааниси жок. Демек, өзгөрмөнү name
класстан Human
өзгөрмөдөн name
методдон айырмалоо үчүн кандайдыр бир жол керек болчу.Бул setName
маселени чечүү үчүн, ачкыч сөз киргизилген this
, бул учурда бул ыкманын эмес, өзгөрмөнүн чакырылышы керектигин көрсөтөт. класстын Human
:
this
ал макаланын башында айтылгандай, чакыруу an objectисин билдирет. Натыйжада, адамдын аты setName
түзүлгөн an objectке орнотуучу аркылуу коюлат. Төмөндө ачкыч сөздү колдонбостон code берилген this
. Код класс an objectин жаратат Human
жана ага ат берет:
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);
}
}
Ошентип, ал this
бир эле нерсени белгилөө үчүн жаңы өзгөрмөлөрдү киргизүүдөн качат, бул codeду кошумча өзгөрмөлөр менен "ашыкча жүктөөнү" азыраак кылат.
Экинчи мисал - Муну конструкторду ачык чакыруу үчүн колдонуу
Бир конструкторду башкасынан чакыруу сизде (кызык жери) бир нече конструктор болгондо жана конструктордо мурда берилген инициализация codeун жаңы конструктордо кайра жазгыңыз келбегенде пайдалуу болушу мүмкүн. Чаташып калдыңызбы? Баары көрүнгөндөй коркунучтуу эмес. Төмөнкү codeду караңыз, анын эки класс конструктору барHuman
:
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
Бул жерде бизде адегенде жана кабыл алган эки параметрдүү конструктор бар int weight
. Ага эки сап code жаздык дейли:
this.age = age;
this.weight = weight;
анан алар жашынан жана салмагынан тышкары бийиктикти да талап кылган үч параметри бар дагы бир конструкторду кошууну чечишти. Жаңы конструктордо сиз муну жазсаңыз болот:
this.age = age;
this.weight = weight;
this.height = height;
Бирок бул конструктордо мурунтан эле жазган codeду кайталоонун ордуна, ачкыч сөздү колдонуп, this
конструкторду эки параметр менен ачык чакырсаңыз болот:
this(age, weight);
// and add the missing variable:
this.height = height;
Ошентип, сиз конструкторго үч параметр менен айтып жатасыз:
- эки параметри бар бул конструкторду чакырыңыз.
- жана жетишпеген өзгөрмө кошуу.
this
статикалык ыкмалардан башка бардык методдорго өткөрүлүп берилет (ошондуктан ал this
көбүнчө имплициттүү параметр деп аталат) жана метод деп аталган an objectке кайрылуу үчүн колдонулушу мүмкүн. Бул ачкыч сөздөн коркуунун кереги жок, анткени This
ал коркунучтуу эмес.
GO TO FULL VERSION