this
және
super
сәйкесінше сынып пен оның суперклассының ағымдағы данасын білдіретін Java тіліндегі екі арнайы кілт сөз. Java бағдарламашылары бұл сөздерді жиі шатастырады және Java Core сұхбаттарында жиі сұралатын олардың ерекше қасиеттері туралы аз хабардар етеді. Мысалы, бірден ойға келетін бір-екі сұрақ -
this
және туралы, Java тіліндегі
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()
және екеуін де қамтуы мүмкін емес super()
.
Супер мен бұл арасындағы айырмашылықтар
Енді біз кілт сөздерді қалай пайдалану керектігін білеміз
super
және
this
олардың не үшін қажет екенін түсінеміз. Бірақ бұл кілт сөздерді пайдаланудың мен айтпаған тағы бір нұсқасы бар - Ішкі сыныптарда, олардың көмегімен сыртқы белгілер формасын пайдаланып сыртқы сыныпқа сілтеме жасау өте ыңғайлы.
this
оның ағымдағы данасы және Сыртқы үшін.
super
- ата-анасы үшін. Outer сөзін сыртқы сынып атауымен ауыстыруды ұмытпаңыз.
this
Енді және кілт сөздердің арасындағы негізгі айырмашылықтарды қысқаша тізіп көрейік
super
- айнымалы
this
ол қолданылатын сыныптың ағымдағы данасына сілтеме жасайды, ал ол super
ата-аналық сыныптың ағымдағы данасына сілтеме жасайды.
- Әрбір конструктор басқа конструкторларға нақты шақырулар болмаған жағдайда,
super()
өзінің ата-аналық сыныбының аргументі жоқ конструкторын жасырын түрде шақырады, бірақ сізде әрқашан кез келген басқа конструкторды this()
немесе көмегімен анық шақыру мүмкіндігі бар super()
.
this
Бұл кілт сөздер мен Java тіліндегі айырмашылықтар
super
және олардың бағдарламаларда қалай қолданылатыны туралы айтуға болатын нәрсе. Көріп отырғанымыздай, олардың негізгі мақсаты бір конструкторды екіншісінен шақыру және ағымдағы сыныпта және оның ата-аналық класында жарияланған айнымалы айнымалы мәндерге сілтеме жасау болып табылады. Бұл кәдімгі айнымалылар емес екенін ұмытпаңыз, ал қазір - бірінші абзацта сұраған сұрағыма жауап. Жоқ, айнымалыға
this
жаңа мән тағайындау мүмкін емес, себебі ол түпкілікті деп жарияланған. Мұны IDE ішінде орындауға тырысуға болады - сіз "айнымалыға жаңа мән тағайындай алмайсыз
this
- ол түпкілікті деп жарияланған" компиляция қатесін аласыз.
Түпнұсқа мақала осында .
GO TO FULL VERSION