this
жана
super
тиешелүүлүгүнө жараша класстын жана анын суперклассынын учурдагы инстанциясын билдирген Javaдагы эки өзгөчө ачкыч сөздөр. Java программисттери көбүнчө бул сөздөрдү чаташтырышат жана Java Core интервьюларында көп суралган өзгөчө касиеттери жөнүндө анча бorшпейт. Мисалы, дароо эле ойго келген бир-эки суроолор
this
жана , Java тorндеги
super
ачкыч сөзгө башка маани берүү мүмкүнбү ? жана ачкыч сөздөр менен Java
this
ортосунда кандай айырма бар . Билбейм? Ооба, мен бул жерде жооп бербейм - бул макаланын аягында тапса болот. Ошентип, мен башында айткандай, Java менен негизги айырмачылык - класстын учурдагы инстанциясы, ал эми ата-эне класстын учурдагы үлгүсү билдирет. Бул жерде өзгөрмөлөрдү колдонуунун бир мисалы жана - сиз буга чейин биринин конструкторлорун экинчисинен чакыруунун мисалдарын көргөнсүз, деп аталган. чынжырдагы конструкторлорду чакырып, бул ачкыч сөздөрдү жана колдонуу аркылуу мүмкүн болот . Класстын ичинде анын аргументсиз конструкторун чакыруу үчүн колдонулат , ал эми аргументсиз конструкторду чакыруу үчүн колдонулат, же ал ошондой эле ата-энелер классынын демейки конструктору деп аталат. Айтмакчы, ушундай жол менен аргументсиз конструкторду гана эмес, ага тиешелүү параметрлерди берүү менен каалаган башка конструкторду да чакыра аласыз. Бул колдонуунун мисалын жакында көрөбүз . Ошондой эле Javaда алар класс инстанциясынын жана анын ата-энесинин өзгөрмөлөрүнө жетүү үчүн колдонулат. Чынында, аларга жана префикстерисиз кирүүгө болот , бирок учурдагы блокто мындай өзгөрмөлөр башка өзгөрмөлөр менен дал келбесе гана, б.а. эгерде ал бирдей аталыштагы локалдык өзгөрмөлөрдү камтыбаса, антпесе префикстүү аттарды колдонууга туура келет, бирок бул маанилүү эмес, анткени бул формада алар ого бетер окумдуу. Бул ыкманын классикалык мисалы - аны инстанция өзгөрмөсү менен бирдей аталыштагы параметрди кабыл алган конструктордун ичинде колдонуу . Кийинчерээк макалада жана ортосунда дагы кандай айырмачылыктар бар экенин билебиз жана аларды колдонуунун кээ бир мисалдарын карап чыгабыз.
this
super
this
super
this
super
this
super
this
super
this()
super()
this
super
this
super
super
this
this
super
this
Бул жана супер кандай окшош
this
жана ачкыч сөздөрдүн ортосундагы айырмачылыктарды карап чыгуудан мурун
super
, алардын айрым окшоштуктарын карап көрөлү:
this
, жана экөө тең super
статикалык эмес өзгөрмөлөр, ошондуктан аларды статикалык контекстте колдонууга болбойт, демек аларды негизги методдо колдонууга болбойт. Бул компиляция убактысынын катасына алып келет "статикалык эмес өзгөрмөгө this
статикалык контексттен шилтеме жасоо мүмкүн эмес". Эгер сиз негизги ыкмада ачкыч сөздү колдонсоңуз, ошол эле нерсе болот super
.
this
, жана конструкторлордун super
ичинде башка конструкторлорду чынжырча чакыруу үчүн колдонсо болот, мисалы, this
() жана super
() конструкторду мурастоочу жана ата-эне класстарынын аргументтерисиз чакырат.
Төмөндөгү мисалда биз адегенде В классындагы аргументи жок конструктордон түрдөгү бир параметрди кабыл алган ошол эле В классындагы конструкторго чакырууну өткөрөбүз
String
, ал өз кезегинде
super("")
суперкласстан бир аргументтүү конструкторду чакырат.
class A{
A(){
System.out.println("Конструктор без аргументов класса A");
}
A(String args){
System.out.println("Конструктор с одним аргументом класса A");
}
}
class B extends A{
B(){
this("");
System.out.println("Конструктор без аргументов класса B");
}
B(String args){
super("");
System.out.println("Конструктор с одним аргументом класса B");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
}
}
Чыгуу: А классынын бир аргументтүү конструктору В классынын бир аргументтүү конструктору В классынын аргументи жок конструктор
- Конструктордун ичинде
this
, жана super
эң башында бардык башка туюнтмалардан жогору болушу керек, антпесе компилятор ката билдирүүсүн чыгарат. Ушундан улам бир конструктор this()
, жана экөөнү тең камтый алbyte super()
.
Супер менен мунун айырмасы
Эми биз ачкыч сөздөрдү кантип колдонууну билебиз
super
жана
this
алар эмне үчүн керек экенин түшүнөбүз. Бирок бул ачкыч сөздөрдү колдонуунун мен айтпаган дагы бир варианты бар - ички класстарда, алардын жардамы менен Outer notation формасын колдонуу менен сырткы класска кайрылуу абдан ыңгайлуу.
this
анын учурдагы мисалы үчүн жана тышкы.
super
- ата-энеси үчүн. Сырткы класстын аталышы менен алмаштырууну унутпаңыз.
this
Эми ачкыч сөздөрдүн ортосундагы негизги айырмачылыктарды кыскача тизмелеп көрөлү
super
- өзгөрмө ал
this
колдонулган класстын учурдагы инстанциясын билдирет, ал эми ал super
ата-эне класстын учурдагы инстанциясын билдирет.
- Ар бир конструктор, башка конструкторлорго ачык чалуулар болбогондо,
super()
анын ата-эне классынын аргументсиз конструкторун кыйыр түрдө чакырат, бирок сизде ар дайым башка конструкторду this()
, же менен ачык чакыруу мүмкүнчүлүгү бар super()
.
this
Бул, балким, ачкыч сөздөр менен
super
Java ортосундагы айырмачылыктар жана алардын программаларда кандайча колдонулушу жөнүндө айтса болот . Көрүнүп тургандай, алардын негизги максаты - бир конструкторду экинчисинен чакыруу жана учурдагы класста жана анын ата-эне классында жарыяланган инстанция өзгөрмөлөрүнө кайрылуу. Бул кадимки өзгөрмөлөр эмес экенин унутпаңыз, эми - биринчи абзацта сураган менин суроомо жооп. Жок, өзгөрмөгө
this
жаңы маани берилбейт, анткени ал акыркы деп жарыяланган. Муну IDEде жасоого аракет кылсаңыз болот - сиз компиляция катасын аласыз "сиз өзгөрмөгө жаңы маани бере албайсыз
this
- ал акыркы деп жарыяланды."
Оригиналдуу макала бул жерде .
GO TO FULL VERSION