Салом! Ҳангоми гузаштан аз JavaRush, шумо зиёда аз як маротиба бо намудҳои ибтидоӣ дучор омадаед. Дар ин ҷо як рӯйхати кӯтоҳи он чизест, ки мо дар бораи онҳо медонем:
Аммо, ба ғайр аз арзишҳо, намудҳо дар ҳаҷми хотира низ фарқ мекунанд.
Навъи
- Онҳо an object нестанд ва арзиши дар хотира нигоҳ дошташударо ифода мекунанд
- Якчанд навъҳои ибтидоӣ мавҷуданд:
- Рақамҳои пурра -
byte
,short
,int
,long
- Рақамҳои нуқтаи шинокунанда (касри) -
float
ваdouble
- булӣ -
boolean
- Рамзӣ (барои нишон додани ҳарфҳо ва рақамҳо) -
char
- Рақамҳои пурра -
- Ҳар яки онҳо дорои доираи арзишҳои худро доранд:
Навъи ибтидоӣ | Андоза дар хотира | Диапазони арзишҳо |
---|---|---|
byte | 8 бит | -128 ба 127 |
кӯтоҳ | 16 бит | ба -32768 то 32767 |
char | 16 бит | аз 0 то 65536 |
int | 32 бит | аз -2147483648 то 2147483647 |
дароз | 64 бит | аз -9223372036854775808 то 9223372036854775807 |
шино кардан | 32 бит | аз (2 ба қудрат -149) то ((2-2 ба қудрат -23)*2 ба қудрат 127) |
дучанд | 64 бит | аз (-2 ба дараҷаи 63) ба ((2 ба дараҷаи 63) - 1) |
булӣ | 8 (вақте ки дар массивҳо истифода мешаванд), 32 (вақте ки дар массивҳо истифода намешаванд) | рост ё дурӯғ |
int
бештар аз byte
. А long
- зиёда аз short
. Миқдори хотираи ишғолкардаи ибтидоиро метавон бо лӯхтакҳои лона муқоиса кард: Дар дохor лӯхтак фазои холӣ мавҷуд аст. Чӣ қадаре ки лӯхтаки лона калонтар бошад, ҳамон қадар ҷой бештар мешавад. long
Мо метавонем ба осонӣ дар дохor лӯхтаки калони лона гузорем int
. Он ба осонӣ мувофиқат мекунад ва ба шумо ҳеҷ чизи иловагӣ лозим нест. Дар Java, ҳангоми кор бо ибтидоӣ, ин табдилдиҳии автоматӣ номида мешавад. Ба таври дигар онро васеъшавӣ меноманд. Инак як мисоли оддии васеъшавӣ:
public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
byte littleNumber = 16;
bigNumber = littleNumber;
System.out.println(bigNumber);
}
}
byte
Дар ин ҷо мо ба тағирёбанда арзиш таъин мекунем int
. Супориш бомуваффақият ва бе ягон мушкилот анҷом ёфт: арзиши byte
дар int
. "Лӯхтаки лона" (арзиш byte
) ба осонӣ ба "матрешкаи калон" (тағйирёбанда int
) мувофиқат мекунад. Ин масъалаи дигар аст, вақте ки шумо кӯшиш мекунед, ки баръакс амал кунед - ба тағирёбанда арзиши калон гузоред, ки барои чунин андозаҳо пешбинӣ нашудааст. Аслан, ин ҳилла бо лӯхтакҳои воқеии лона кор намекунад, аммо дар Java он кор хоҳад кард, аммо бо нозукиҳо. Биёед кӯшиш кунем, ки арзишро int
ба тағирёбанда гузорем short
:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = bigNumber;//error!
System.out.println(bigNumber);
}
Хатогӣ! Тартибдиҳанда мефаҳмад, ки шумо кӯшиши як чизи ғайристандартиро анҷом дода истодаед ва int
дар дохor як лӯхтаки матрешкаи калон ( ) гузоред ( short
). Хатогии ҷамъоварӣ дар ин ҳолат огоҳии компилятор аст: " Ҳей, шумо мутмаин ҳастед, ки ин корро кардан мехоҳед? "Агар шумо боварӣ дошта бошед, ба тартибдиҳанда дар ин бора бигӯед:" Ҳама чиз хуб аст, ман медонам, ки чӣ кор карда истодаам! ” Ин раванд табдor навъи возеҳ ё танг номида мешавад . Барои танг кардан, шумо бояд ба таври возеҳ намудеро нишон диҳед, ки шумо мехоҳед арзиши худро ба он гузоред. Ба ибораи дигар, ба саволи мураттиб ҷавоб диҳед: " Хуб, шумо ин лӯхтаки калонро ба кадоме аз ин лӯхтакҳо гузоштан мехоҳед?" ” Дар ҳолати мо он чунин хоҳад буд:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = (short) bigNumber;
System.out.println(littleNumber);
}
Мо ба таври возеҳ нишон додем, ки мо мехоҳем арзишро int
ба тағирёбанда мувофиқ созем short
ва барои он масъулиятро ба дӯш гирем. Компилятор нишонаи возеҳи навъи тангтарро дида, табдилро анҷом медиҳад. Оқибат чӣ мешавад? Натиҷаи консол: -27008 Каме ғайричашмдошт. Чаро маҳз ҳамин тавр? Ин дар асл оддӣ аст. Мо арзиши аслӣ доштем - 10000000 Он дар як тағирёбанда нигоҳ дошта шуд int
, ки 32 битро ишғол мекард ва дар шакли бинарӣ чунин менамуд: Мо ин арзишро ба тағирёбанда менависем short
, аммо он танҳо 16 битро нигоҳ дошта метавонад! Мувофиқи он, танҳо 16 битҳои аввали рақами мо ба он ҷо интиқол дода мешаванд, боқимонда партофта мешаванд. Дар натиҷа, тағирёбанда short
дорои арзиши , ки дар шакли даҳӣ комилан ба -27008 баробар аст, дар бар мегирад, бинобар ин, компилятор "тасдиқро дархост кард" дар шакли як намуди мушаххас. Якум, ин нишон медиҳад, ки шумо барои натиҷа масъулият доред ва дуюм, он ба тартибдиҳанда мегӯяд, ки ҳангоми рехтани намудҳо чӣ қадар ҷой ҷудо кардан лозим аст. Охир, агар дар мисоли охирин мо int
ба type byte
, на ба -ро меандохтем short
, дар ихтиёри мо танҳо 8 бит мебуд, на 16 ва натиҷа дигар мешуд. Барои намудҳои касрӣ ( float
ва double
), тангшавӣ ба таври гуногун сурат мегирад. Агар шумо кӯшиш кунед, ки чунин ададро ба навъи бутун табдил диҳед, қисми касри он партофта мешавад.
public static void main(String[] args) {
double d = 2.7;
long x = (int) d;
System.out.println(x);
}
Натиҷаи консол: 2
Навъи маълумот char
Шумо аллакай медонед, ки навъи char барои намоиши аломатҳои инфиродӣ истифода мешавад.public static void main(String[] args) {
char c = '!';
char z = 'z';
char i = '8';
}
Аммо он як қатор хусусиятҳо дорад, ки барои фаҳмидани он муҳиманд. Биёед бори дигар ба ҷадвал бо диапазони арзишҳо назар андозем:
Навъи ибтидоӣ | Андоза дар хотира | Диапазони арзишҳо |
---|---|---|
byte | 8 бит | -128 ба 127 |
кӯтоҳ | 16 бит | -32768 ба 32767 |
char | 16 бит | аз 0 то 65536 |
int | 32 бит | аз -2147483648 то 2147483647 |
дароз | 64 бит | аз -9223372036854775808 то 9223372036854775807 |
шино кардан | 32 бит | аз (2 ба қудрат -149) то ((2-2 ба қудрат -23)*2 ба қудрат 127) |
дучанд | 64 бит | аз (-2 ба қудрати 63) ба ((2 ба қудрати 63)-1) |
булӣ | 8 (вақте ки дар массивҳо истифода мешаванд), 32 (вақте ки дар массивҳо истифода намешаванд) | рост ё дурӯғ |
char
рақамӣ аз 0 то 65536 дорад. Аммо ин чӣ маъно дорад? Дар ниҳоят, char
инҳо на танҳо рақамҳо, балки ҳарфҳо, аломатҳои пунктуатсия мебошанд... Гап дар он аст, ки арзишҳо char
дар Java дар формати Юниcode нигоҳ дошта мешаванд. Мо аллакай дар яке аз лексияҳои қаблӣ бо Юниcode дучор шуда будем. Шояд шумо дар хотир доред, ки Юниcode стандарти рамзгузории аломатҳост, ки аломатҳои қариб ҳамаи забонҳои хаттии ҷаҳонро дар бар мегирад. Ба ибораи дигар, ин рӯйхати рамзҳои махсусест, ки дар он рамзи қариб ҳар як аломат аз ҳар забон мавҷуд аст. Ҷадвали умумии Юниcode хеле калон аст ва, албатта, лозим нест, ки онро аз худ ёд гиред. Дар ин ҷо, масалан, як пораи он аст: Хӯроки асосӣ ин аст, ки фаҳмидани принсипи нигоҳдории арзишҳо char
, ва дар хотир доред, ки донистани рамзи рамзи мушаххас, шумо ҳамеша метавонед онро дар барнома дастрас кунед. Биёед инро бо рақами тасодуфӣ санҷем:
public static void main(String[] args) {
int x = 32816;
char c = (char) x ;
System.out.println(c);
}
Натиҷаи консол: 耰 Ин форматест, ки дар Java аломатҳо нигоҳ дошта мешаванд char
. Ҳар як аломат ба рақам мувофиқ аст - рамзи ададии 16 бит ё ду byte. Юниcodeи 32816 ба аломати 耰 мувофиқат мекунад. Ба ин лаҳза диққат диҳед. Дар ин мисол мо тағирёбандаро истифода мебарем int
. Он 32 бит хотираро ишғол мекунад , дар ҳоле ки char
16 бит . Дар ин ҷо мо интихоб кардем , зеро рақами ба мо лозим 32816 аз доираи диапазон берун аст . Ҳарчанд андозаи , мисли кӯтоҳ, 16 бит аст, дар диапазон рақамҳои манфӣ вуҷуд надоранд, аз ин рӯ диапазони "мусбат" ду маротиба калонтар аст (65536 ба ҷои 32767 ). Мо метавонем -ро истифода барем , ба шарте ки рамзи мо ба доираи 65536 рост ояд. Аммо агар мо рақам эҷод кунем , он зиёда аз 16 битро мегирад. Ва ҳангоми маҳдуд кардани намудҳо: int
short
char
char
char
short
int
int >65536
char c = (char) x;
битҳои иловагӣ партофта мешаванд ва натиҷа хеле ғайричашмдошт хоҳад буд.
Хусусиятҳои иловаи аломат ва ададҳои бутун
Биёед ба ин мисоли ғайриоддӣ назар кунем:public class Main {
public static void main(String[] args) {
char c = '1';
int i = 1;
System.out.println(i+c);
}
}
Натиҷаи консол: 50 O_O Мантиқ куҷост? 1+1, 50 аз куҷо пайдо шуд?! Шумо аллакай медонед, ки арзишҳо char
дар хотира ҳамчун рақамҳо дар диапазони аз 0 то 65536 нигоҳ дошта мешаванд, ки Юниcodeи аломати моро ифода мекунанд. Пас, ин ҷост. Вақте ки мо илова мекунем char
ва баъзе намуди бутун char
ба рақаме, ки ба он дар Юниcode мувофиқ аст, табдил дода мешавад. Вақте ки мо дар codeи худ 1 ва '1' илова кардем, рамзи '1' ба рамзи он табдил ёфт, ки 49 аст (шумо метавонед онро дар ҷадвали боло тафтиш кунед). Аз ин рӯ, натиҷа ба 50 баробар шуд. Биёед бори дигар дӯсти деринаи худро -耰мисол гирем ва кӯшиш кунем, ки онро бо рақам илова кунем.
public static void main(String[] args) {
char c = '耰';
int x = 200;
System.out.println(c + x);
}
Натиҷаи консол: 33016 Мо аллакай фаҳмидем, ки耰ба рамзи 32816 мувофиқат мекунад. Ва вақте ки мо ин рақам ва 200-ро илова мекунем, мо маҳз натиҷаи худро мегирем - 33016 :) Механизми кор, чунон ки шумо мебинед, хеле содда аст.
GO TO FULL VERSION