this
ва
super
ду калимаи махсуси калидӣ дар Java мебошанд, ки мутаносибан намунаи кунунии синф ва суперкласси онро ифода мекунанд. Барномасозони Java аксар вақт ин калимаҳоро ошуфта мекунанд ва дар бораи хосиятҳои махсуси онҳо, ки аксар вақт дар мусоҳибаҳои Java Core пурсида мешаванд, огоҳии кам нишон медиҳанд. Масалан, якчанд саволе, ки дарҳол ба хотир меоянд, дар бораи
this
ва
super
, Оё мумкин аст, ки ба калимаи калидӣ
this
дар Java маънои дигар таъин карда шавад? ва фарқияти байни калимаҳои калидӣ
this
ва
super
Java чӣ гуна аст. Намедонам? Хуб, ман дар ин ҷо ҷавоб намедиҳам - онро дар охири мақола пайдо кардан мумкин аст.
Ҳамин тавр, тавре ки ман дар ибтидо гуфтам, фарқи асосии байни
this
Java
super
дар он аст, ки
this
намунаи кунунии синф намояндагӣ мекунад, дар ҳоле ки
super
намунаи кунунии синфи волидайн намояндагӣ мекунад. Ин аст як мисоли истифодаи тағирёбандаҳо
this
ва
super
- шумо эҳтимол аллакай мисолҳои даъват кардани конструкторҳоро аз дигаре дидаед, ки ба истилоҳ. даъвати конструкторҳо дар як занҷир, ин тавассути истифодаи калимаҳои калидӣ
this
ва имконпазир аст
super
. Дар дохor синф барои даъват кардани созандаи беаргументи он истифода мешавад
this()
, дар ҳоле ки
super()
он барои даъват кардани созандаи беаргумент ё тавре ки онро низ меноманд, созандаи пешфарзи синфи волидайн истифода мешавад. Воқеан, бо ин роҳ шумо метавонед на танҳо конструкторро бидуни аргумент, балки ягон конструктори дигарро низ бо додани параметрҳои мувофиқ даъват кунед. Мо ба зудӣ мисоли ин
this
истифодаро мебинем
super
. Инчунин дар
this
Java
super
онҳо барои дастрасӣ ба тағирёбандаҳои мисоли синф ва волидайни он истифода мешаванд. Дар асл, ба онҳо бе пешояндҳои
super
ва дастрас шудан мумкин аст
this
, аммо танҳо агар дар блоки ҷорӣ чунин тағирёбандаҳо бо дигар тағирёбандаҳо мувофиқат накунанд, яъне. агар он дорои тағирёбандаҳои маҳаллӣ бо ҳамон номҳо набошад, дар акси ҳол шумо бояд номҳоро бо префикс истифода баред, аммо ин муҳим нест, зеро дар ин шакл боз хам бештар хониш мешаванд. Намунаи классикии ин равиш истифодаи он
this
дар дохor созанда мебошад, ки параметреро бо ҳамон ном бо тағирёбандаи мисол мегирад. Баъдтар дар мақола мо мефаҳмем, ки байни
super
ва чӣ фарқиятҳои дигар мавҷуданд
this
ва ба баъзе мисолҳои истифодаи онҳо нигаред.
Чӣ тавр ин ва супер монанданд
Пеш аз он ки фарқияти байни калимаҳои калидӣ
this
ва
super
, биёед баъзе шабоҳатҳои онҳоро бубинем:
- Ҳарду
this
ва ҳам super
тағирёбандаҳои ғайристатикӣ мебошанд, бинобар ин онҳоро дар контексти статикӣ истифода бурдан мумкин нест, яъне онҳоро дар усули асосӣ истифода бурдан мумкин нест. Ин боиси хатои вақти компиляция мегардад "ба тағирёбандаи ғайристатикӣ this
аз контексти статикӣ истинод кардан мумкин нест". Ҳамин чиз рӯй медиҳад, агар шумо калимаи калидиро дар усули асосӣ истифода баред super
.
- Ҳарду
this
, ва super
мумкин аст дар дохor созандаҳо барои даъват кардани конструкторҳои дигар дар занҷир истифода шаванд, масалан, 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();
}
}
Натиҷа: Созандаи як аргументи синфи A Созандаи як аргументи синфи B Конструктори як аргументи синфи В
- Дар дохor конструктор
this
, ва super
бояд дар аввал аз ҳама ибораҳои дигар пайдо шавад, вагарна компилятор паёми хатогӣ медиҳад. Аз ин бармеояд, ки як созанда наметавонад ҳарду this()
ва -ро дар бар гирад super()
.
Тафовут байни супер ва ин
Акнун мо медонем, ки чӣ гуна калимаҳои калидиро истифода барем
super
ва
this
фаҳмем, ки чаро онҳо лозиманд. Аммо як варианти дигари истифодаи ин калимаҳои калидӣ вуҷуд дорад, ки ман зикр накардаам - дар синфҳои дохилӣ, ки дар он бо ёрии онҳо истинод ба синфи берунӣ бо истифода аз варақаи нотаҳои берунӣ хеле қулай аст.
this
барои мисоли ҳозираи он ва берунӣ.
super
- барои падару модараш. Фаромӯш накунед, ки берунро бо номи синфи берунӣ иваз кунед. Акнун биёед мухтасар фарқиятҳои асосии байни калимаҳои калидӣ
this
ва
super
- тағирёбанда
this
ба мисоли ҷории синфе, ки дар он истифода мешавад, ишора мекунад, дар ҳоле ки он super
ба мисоли ҷории синфи волидайн ишора мекунад.
- Ҳар як созанда дар сурати мавҷуд набудани зангҳои возеҳ ба конструкторҳои дигар, ба таври ғайримустақим
super()
созандаи бе далели синфи волидии худро даъват мекунад, аммо шумо ҳамеша имкон доред, ки ба ягон созандаи дигар бо ё this()
, ё super()
.
Эҳтимол ин ҳама чизест, ки дар бораи фарқияти байни калимаҳои калидӣ
this
ва
super
Java ва чӣ гуна истифода шудани онҳо дар барномаҳо гуфтан мумкин аст. Тавре ки мо дидем, ҳадафи асосии онҳо даъват кардани як конструктор аз дигараш ва истинод ба тағирёбандаҳои мисоли дар синфи ҷорӣ ва синфи волидайни он эълоншуда мебошад. Фаромӯш накунед, ки инҳо тағирёбандаҳои оддӣ нестанд ва ҳоло - ҷавоб ба саволи ман, ки ман дар сархати аввал пурсидам. Не, ба тағирёбанда
this
қимати нав таъин карда намешавад, зеро он ниҳоӣ эълон шудааст. Шумо метавонед ин корро дар IDE иҷро кунед - шумо хатои ҷамъоварӣ хоҳед гирифт "шумо наметавонед ба тағирёбанда арзиши нав таъин кунед
this
- он ниҳоӣ эълон шудааст."
Мақолаи аслӣ дар ин ҷо .
GO TO FULL VERSION