Java синтаксисін түсінбей, байыпты әзірлеуші болу мүмкін емес, сондықтан біз бүгінде синтаксисті үйренуді жалғастырамыз. Алдыңғы мақалалардың бірінде біз қарабайыр айнымалылар туралы айтқан болатынбыз, бірақ айнымалылардың екі түрі болғандықтан, бүгін біз екінші типті - Java тіліндегі анықтамалық типтер туралы айтатын боламыз. Сонда бұл не? Неліктен Java тілінде анықтамалық деректер түрлері қажет? Бізде арна нөмірі, дыбыс деңгейі және жалауша сияқты кейбір сипаттамалары бар теледидар нысаны бар деп елестетіп көрейік:
public class TV {
int numberOfChannel;
int soundVolume;
boolean isOn;
}
, сияқты қарапайым түрі int
бұл деректерді қалай сақтай алады? Еске түсірейік: бір айнымалы int
4 byte. Бірақ ішінде бір типтегі екі айнымалы (4 byte + 4 byte) бар, сонымен қатар boolean
(+1 byte) ... Барлығы - 4-тен 9-ға дейін, бірақ әдетте an objectте әлдеқайда көп ақпарат сақталады. Не істеу? Нысанды айнымалыға қоюға болмайды. Біздің тарихымыздың осы нүктесінде анықтамалық айнымалылар пайда болады. Анықтамалық айнымалылар нақты an object орналасқан жад орнының мекенжайын сақтайды. Яғни, бұл мекен-жайы бар «визит картасы», оның көмегімен біз ортақ жадта өз нысанымызды таба аламыз және онымен кейбір манипуляцияларды жасай аламыз. Java тіліндегі кез келген нысанға сілтеме анықтамалық айнымалы болып табылады. Бұл біздің теледидар нысанында келесідей болады:
TV telly = new TV();
telly
Біз TV түріндегі жасалған нысанға сілтемеге атауы бар теледидар түрінің айнымалысын орнаттық. Яғни, JVM жадты теледидар нысаны үшін үйіндіге бөледі, оны және оның жадтағы мекен-жайына addressін жасайды, оны стекте telly
сақталған айнымалыға қояды. Жад туралы, атап айтқанда стек және басқа да көптеген пайдалы ақпаратты осы лекциядан оқи аласыз . Теледидар түріндегі айнымалы және теледидар түріндегі an object, байқадыңыз ба? Бұл себепсіз емес: белгілі бір типтегі an objectілерде бірдей типтегі сәйкес айнымалылар болуы керек (мұрагерлік пен интерфейсті іске асыруды есептемегенде, бірақ қазір біз мұны ескермейміз). Ақыр соңында, біз сорпаны стақанға құймаймыз, солай ма? Біздің an objectіміз теледидар, ал оның анықтамалық айнымалысы басқару панелі сияқты болып шықты. Бұл қашықтан басқару пультін пайдалану арқылы біз an objectімізбен және оның деректерімен әрекеттесе аламыз. Мысалы, біздің теледидар үшін сипаттамаларды орнатыңыз:
telly.isOn = true;
telly.numberOfChannel = 53;
telly.soundVolume = 20;
.
Мұнда біз айнымалыға сілтеме жасайтын нысанның ішкі элементтеріне қол жеткізу және пайдалануды бастау үшін нүкте операторын қолдандық . Мысалы, бірінші жолда біз айнымалыға айттық : « Сілтеме жасап отырған нысанның telly
ішкі айнымалы мәнін беріңіз және оны шын мәніне орнатыңыз» (біз үшін теледидарды қосыңыз).isOn
Анықтамалық айнымалыларды қайта анықтау
Бізде сілтеме түрінің екі айнымалысы және оларға сілтеме жасайтын an objectілер бар делік:TV firstTV = new TV();
TV secondTV = new TV();
Жазсақ:
firstTV = secondTV;
бұл бірінші айнымалыны екінші нысанға мекенжайдың көшірмесін (мекенжай биттерінің мәні) мән ретінде тағайындағанымызды білдіреді, ал енді екі айнымалы мән екінші нысанға сілтеме жасайды (басқаша айтқанда, сол үшін екі қашықтан басқару құралы). теледидар). Бұл ретте бірінші нысан оған сілтеме жасайтын айнымалысыз қалды. Нәтижесінде бізде қол жеткізу мүмкін емес нысан бар, өйткені айнымалы оған өте шартты ағын болды, онсыз ол қоқысқа айналады, жай ғана жадта қалады және орын алады. Бұл нысан кейіннен қоқыс жинаушы арқылы жадтан жойылады . Сіз басқа сілтемесіз нысанмен байланыстырушы жіпті үзе аласыз:
secondTV = null;
Нәтижесінде нысанға бір ғана сілтеме болады - firstTV
, және secondTV
енді ешкімді көрсетпейді (бұл бізге болашақта оған теледидар сияқты қандай да бір нысанға сілтеме тағайындауға кедергі жасамайды).
Жол сыныбы
Бөлек, мен String сыныбын атап өткім келеді . Бұл жол ретінде сақталатын деректерді сақтауға және олармен жұмыс істеуге арналған базалық класс. Мысалы:String text = new String("This TV is very loud");
Мұнда біз нысанның конструкторында сақталатын жолды өткіздік. Бірақ мұны ешкім жасамайды. Өйткені, жолдарды жасауға болады:
String text = "This TV is very loud";
Әлдеқайда ыңғайлы, солай ма? Қолдану танымалдылығы жағынан String
ол қарабайыр типтерден кем түспейді, бірақ ол бәрібір класс болып табылады және оған сілтеме жасайтын айнымалы қарабайыр тип емес, сілтеме типі. Бізде String
жолдарды біріктірудің тамаша мүмкіндігі бар:
String text = "This TV" + " is very loud";
Нәтижесінде біз қайтадан мәтінді аламыз: This TV is very loud
, өйткені екі жол бір бүтінге біріктіріледі және айнымалы осы толық мәтінге сілтеме жасайды. Маңызды нюанс - String
бұл өзгермейтін класс. Бұл нені білдіреді? Мына мысалды алайық:
String text = "This TV";
text = text + " is very loud";
Барлығы қарапайым сияқты: біз айнымалыны жариялаймыз, оған мән береміз. Келесі жолда біз оны өзгертеміз. Бірақ біз шынымен өзгермейміз. Бұл өзгермейтін класс болғандықтан, екінші жолда бастапқы мән өзгертілмейді, бірақ жаңасы жасалады, ол өз кезегінде біріншіден тұрады + " is very loud"
.
Анықтамалық тұрақтылар
Қарапайым типтер туралы мақалада біз тұрақтылар тақырыбын қозғадық. Біз оны түпкілікті деп жариялағанда анықтамалық айнымалы қалай әрекет етеді ?final TV telly = new TV();
Бұл нысанды өзгермейтін етеді деп ойлауыңыз мүмкін. Бірақ жоқ, бұл дұрыс емес. Модификаторы бар анықтамалық айнымалы final
оны қандай да бір жолмен ажырату мүмкіндігінсіз белгілі бір нысанға байланысты болады (оны қайта анықтаңыз немесе оны теңестіріңіз null
). Яғни, мұндай айнымалының мәнін орнатқаннан кейін келесідей code:
telly = new TV();
немесе
telly = null;
компиляция қатесін тудырады. Яғни, final
ол тек сілтемеде әрекет етеді және an objectінің өзіне ешқандай әсер етпейді. Бастапқыда ол өзгермелі болса, оның ішкі күйін еш қиындықсыз өзгерте аламыз:
telly.soundVolume = 30;
Кейде айнымалылар тіпті әдіс аргументтерінің өзінде түпкілікті болып белгіленеді!
public void enableTV (final TV telly){
telly.isOn = true;
}
Бұл әдісті жазу процесінде бұл аргументтерді жоққа шығаруға болмайтындай етіп жасалады және сәйкесінше, аз шатасулар тудырады. final
Егер өзгермейтін нысанға сілтеме жасайтын анықтамалық айнымалыны белгілесек ше ? Мысалы String
:
final String PASSWORD = "password";
Нәтижесінде біз константты аламыз, қарабайыр типті константалардың аналогы, өйткені мұнда сілтемені қайта анықтай алмаймыз да, an objectінің ішкі күйін де өзгерте алмаймыз (ішкі деректер).
Жинақтау
- Қарапайым айнымалылар мән биттерін сақтаса, анықтамалық айнымалылар нысанның алу жолын көрсететін биттерді сақтайды.
- Нысан сілтемелері нысанның тек бір түрі үшін жарияланады.
- Java тіліндегі кез келген класс анықтамалық тип болып табылады.
- Java тіліндегі кез келген анықтамалық айнымалының әдепкі мәні болып табылады
null
. String
сілтеме түрінің стандартты мысалы болып табылады. Бұл сынып та өзгермейді.- Модификаторы бар анықтамалық айнымалылар
final
қайта анықтау мүмкіндігінсіз тек бір нысанға байланысты.
GO TO FULL VERSION