JavaRush /Java блогы /Random-KK /Java тіліндегі анықтамалық деректер түрлері

Java тіліндегі анықтамалық деректер түрлері

Топта жарияланған
Java синтаксисін түсінбей, байыпты әзірлеуші ​​болу мүмкін емес, сондықтан біз бүгінде синтаксисті үйренуді жалғастырамыз. Алдыңғы мақалалардың бірінде біз қарабайыр айнымалылар туралы айтқан болатынбыз, бірақ айнымалылардың екі түрі болғандықтан, бүгін біз екінші типті - Java тіліндегі анықтамалық типтер туралы айтатын боламыз. Сонда бұл не? Неліктен Java тілінде анықтамалық деректер түрлері қажет? Java тіліндегі анықтамалық деректер түрлері - 1Бізде арна нөмірі, дыбыс деңгейі және жалауша сияқты кейбір сипаттамалары бар теледидар нысаны бар деп елестетіп көрейік:
public class TV {
   int numberOfChannel;
   int soundVolume;
   boolean isOn;
}
, сияқты қарапайым түрі intбұл деректерді қалай сақтай алады? Еске түсірейік: бір айнымалы int4 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;
бұл бірінші айнымалыны екінші нысанға мекенжайдың көшірмесін (мекенжай биттерінің мәні) мән ретінде тағайындағанымызды білдіреді, ал енді екі айнымалы мән екінші нысанға сілтеме жасайды (басқаша айтқанда, сол үшін екі қашықтан басқару құралы). теледидар). Бұл ретте бірінші нысан оған сілтеме жасайтын айнымалысыз қалды. Нәтижесінде бізде қол жеткізу мүмкін емес нысан бар, өйткені айнымалы оған өте шартты ағын болды, онсыз ол қоқысқа айналады, жай ғана жадта қалады және орын алады. Бұл нысан кейіннен қоқыс жинаушы арқылы жадтан жойылады . Java тіліндегі анықтамалық деректер түрлері – 2Сіз басқа сілтемесіз нысанмен байланыстырушы жіпті үзе аласыз:
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();
Бұл нысанды өзгермейтін етеді деп ойлауыңыз мүмкін. Бірақ жоқ, бұл дұрыс емес. Java тіліндегі анықтамалық деректер түрлері – 3Модификаторы бар анықтамалық айнымалы 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інің ішкі күйін де өзгерте алмаймыз (ішкі деректер).

Жинақтау

  1. Қарапайым айнымалылар мән биттерін сақтаса, анықтамалық айнымалылар нысанның алу жолын көрсететін биттерді сақтайды.
  2. Нысан сілтемелері нысанның тек бір түрі үшін жарияланады.
  3. Java тіліндегі кез келген класс анықтамалық тип болып табылады.
  4. Java тіліндегі кез келген анықтамалық айнымалының әдепкі мәні болып табылады null.
  5. Stringсілтеме түрінің стандартты мысалы болып табылады. Бұл сынып та өзгермейді.
  6. Модификаторы бар анықтамалық айнымалылар finalқайта анықтау мүмкіндігінсіз тек бір нысанға байланысты.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION