Salam! JavaRush-dan keçərkən primitiv tiplərə bir dəfədən çox rast gəldiniz. Onlar haqqında bildiklərimizin qısa siyahısı:
Lakin, dəyərlərə əlavə olaraq, növlər yaddaş ölçüsündə də fərqlənir.
Növün
- Onlar obyekt deyillər və yaddaşda saxlanılan dəyəri təmsil edirlər
- Primitiv növlərin bir neçə növü var:
- Tam ədədlər -
byte
,short
,int
,long
- Üzən nöqtəli ədədlər (kəsir) -
float
vədouble
- Boolean -
boolean
- Simvolik (hərfləri və rəqəmləri göstərmək üçün) -
char
- Tam ədədlər -
- Onların hər birinin öz dəyər diapazonu var:
Primitiv tip | Yaddaşdakı ölçü | Dəyərlər diapazonu |
---|---|---|
bayt | 8 bit | -128-dən 127-yə qədər |
qısa | 16 bit | -32768-dən 32767-ə qədər |
char | 16 bit | 0-dan 65536-a qədər |
int | 32 bit | -2147483648-dən 2147483647-yə qədər |
uzun | 64 bit | -9223372036854775808-dən 9223372036854775807-ə qədər |
sal | 32 bit | (2-dən gücə -149) ((2-2 gücə -23)*2 gücə 127) |
ikiqat | 64 bit | (-2-dən 63-ün gücünə) ((2-nin 63-ün gücünə) - 1) |
boolean | 8 (massivlərdə istifadə edildikdə), 32 (qeyri massivlərdə istifadə edildikdə) | doğru və ya yanlış |
int
-dən çox alır byte
. A long
- daha çox short
. Primitivlərin tutduğu yaddaşın miqdarını yuva quran kuklalarla müqayisə etmək olar: Yuva quran kuklanın içərisində boş yer var. Yuva quran kukla nə qədər böyükdürsə, bir o qədər çox yer olur. Böyük bir yuva kuklasının içərisinə long
daha kiçik olanı asanlıqla yerləşdirə bilərik int
. Asanlıqla uyğun gəlir və əlavə bir şey etmək lazım deyil. Java-da primitivlərlə işləyərkən buna avtomatik çevrilmə deyilir. Başqa bir şəkildə buna uzantı deyilir. Budur sadə bir uzantı nümunəsi:
public class Main {
public static void main(String[] args) {
int bigNumber = 10000000;
byte littleNumber = 16;
bigNumber = littleNumber;
System.out.println(bigNumber);
}
}
byte
Burada dəyişənə dəyər təyin edirik int
. Tapşırıq uğurlu və heç bir problem olmadan həyata keçirildi: yaddaşda saxlanılan dəyər byte
"uyğun" olduğundan daha az yaddaş yeri tutur int
. "Kiçik yuva kuklası" (dəyər byte
) asanlıqla "böyük matryoshka"ya (dəyişən int
) uyğun gəlir. Bunun əksini etməyə çalışdığınız zaman başqa məsələdir - bu cür ölçülər üçün nəzərdə tutulmayan dəyişənə böyük bir dəyər qoyun. Prinsipcə, bu hiylə əsl yuva kuklaları ilə işləməyəcək, lakin Java-da işləyəcək, lakin nüanslarla. int
Gəlin dəyişənə dəyər qoymağa çalışaq short
:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = bigNumber;//error!
System.out.println(bigNumber);
}
Xəta! Kompilyator başa düşür ki, siz qeyri-standart bir şey etməyə çalışırsınız və int
kiçik bir ( ) içərisinə böyük bir matryoshka kuklasını ( ) qoyun short
. Bu vəziyyətdə kompilyasiya xətası tərtibçinin xəbərdarlığıdır: “ Hey, bunu etmək istədiyinizə əminsinizmi? “Əminsinizsə, tərtibçiyə bu barədə deyin: “ Hər şey qaydasındadır, mən nə etdiyimi bilirəm!” ” Bu proses açıq tip çevrilmə və ya daralma adlanır . Daraltmaq üçün dəyərinizi hansı növə aid etmək istədiyinizi açıq şəkildə göstərməlisiniz. Başqa sözlə, tərtibçinin sualına cavab verin: " Yaxşı, bu böyük kuklalardan hansını qoymaq istəyirsən?" ” Bizim vəziyyətimizdə bu belə görünəcək:
public static void main(String[] args) {
int bigNumber = 10000000;
short littleNumber = 1000;
littleNumber = (short) bigNumber;
System.out.println(littleNumber);
}
int
Dəyəri dəyişənə uyğunlaşdırmaq short
və bunun üçün məsuliyyət daşımaq istədiyimizi açıq şəkildə bildirdik . Kompilyator, daha dar bir növün açıq bir göstəricisini görərək, bir çevrilmə həyata keçirir. Nəticə nə olacaq? Konsol çıxışı: -27008 Bir az gözlənilməz oldu. Niyə məhz belə? Əslində sadədir. int
Bizim orijinal dəyərimiz var idi - 10000000 O , 32 bit tutan dəyişəndə saxlanılırdı və ikili formada belə görünürdü: Biz bu dəyəri dəyişənə yazırıq short
, lakin o, yalnız 16 bit saxlaya bilir! Müvafiq olaraq, nömrəmizin yalnız ilk 16 biti ora köçürüləcək, qalanları atılacaq. Nəticədə, dəyişən ondalıq formada -27008-ə tam bərabər olan short
dəyəri ehtiva edəcəkdir . Birincisi, bu, nəticə üçün məsuliyyət daşıdığınızı göstərir, ikincisi, tipləri tökərkən kompilyatora nə qədər yer ayırmaq lazım olduğunu bildirir. Axı, əgər sonuncu misalda --a yox, int
type -a köçürsək , bizim ixtiyarımızda 16 deyil, cəmi 8 bit olardı və nəticə fərqli olardı. Kəsrə növlər ( və ) üçün daralma fərqli şəkildə baş verir. Əgər belə bir ədədi tam ədədə çevirməyə cəhd etsəniz, onun kəsr hissəsi atılacaq. byte
short
float
double
public static void main(String[] args) {
double d = 2.7;
long x = (int) d;
System.out.println(x);
}
Konsol çıxışı: 2
Məlumat növü char
Siz artıq bilirsiniz ki, char tipi fərdi simvolları göstərmək üçün istifadə olunur.public static void main(String[] args) {
char c = '!';
char z = 'z';
char i = '8';
}
Ancaq başa düşmək üçün vacib olan bir sıra xüsusiyyətlərə malikdir. Qiymət diapazonu olan cədvələ yenidən baxaq:
Primitiv tip | Yaddaşdakı ölçü | Dəyərlər diapazonu |
---|---|---|
bayt | 8 bit | -128-dən 127-yə qədər |
qısa | 16 bit | -32768-dən 32767-yə qədər |
char | 16 bit | 0-dan 65536-a qədər |
int | 32 bit | -2147483648-dən 2147483647-yə qədər |
uzun | 64 bit | -9223372036854775808-dən 9223372036854775807-ə qədər |
sal | 32 bit | (2-dən gücə -149) ((2-2 gücə -23)*2 gücə 127) |
ikiqat | 64 bit | (-2-dən 63-ün gücünə) ((2-nin 63-ün gücünə)-1) |
boolean | 8 (massivlərdə istifadə edildikdə), 32 (qeyri massivlərdə istifadə edildikdə) | doğru və ya yanlış |
char
0-dan 65536-a qədər rəqəmli diapazonu var. Bəs bu nə deməkdir? Axı char
bunlar təkcə rəqəmlər deyil, həm də hərflər, durğu işarələridir... Fakt budur ki, dəyərlər char
Java-da Unicode formatında saxlanılır. Unicode ilə əvvəlki mühazirələrdən birində artıq rastlaşmışıq. Yəqin xatırlayırsınız ki, Unicode dünyanın demək olar ki, bütün yazılı dillərindən simvolları ehtiva edən simvol kodlaşdırma standartıdır. Başqa sözlə, bu, hər hansı bir dildən demək olar ki, hər hansı bir simvol üçün kodun olduğu xüsusi kodların siyahısıdır. Ümumi Unicode cədvəli çox böyükdür və təbii ki, əzbər öyrənməyə ehtiyac yoxdur. Burada, məsələn, onun bir hissəsidir: Əsas odur ki, dəyərlərin saxlanması prinsipini başa düşmək char
və yadda saxlamaq lazımdır ki , müəyyən bir simvolun kodunu bilməklə onu həmişə proqramda əldə edə bilərsiniz. Gəlin bunu təsadüfi nömrə ilə sınayaq:
public static void main(String[] args) {
int x = 32816;
char c = (char) x ;
System.out.println(c);
}
Konsol çıxışı: 耰 Bu simvolların Java-da saxlandığı formatdır char
. Hər bir simvol bir nömrəyə uyğun gəlir - 16 bitlik rəqəmsal kod və ya iki bayt. Unicode 32816 耰 simvoluna uyğundur. Bu məqama diqqət yetirin. Bu nümunədə dəyişəndən istifadə etdik int
. 32 bit yaddaş tutur , char
16 bit . Bizə lazım olan 32816 nömrə diapazondan kənarda olduğu üçün burada seçdik . Ölçüsü , qısa olduğu kimi, 16 bit olsa da, diapazonda mənfi rəqəmlər yoxdur, buna görə də "müsbət" diapazon iki dəfə böyükdür (32767 əvəzinə 65536 ). Kodumuz 65536 diapazonuna düşdüyü müddətcə istifadə edə bilərik . Amma bir ədəd yaratsaq , o, 16 bitdən çox tutacaq. Və növləri daraldarkən: int
short
char
char
char
short
int
int >65536
char c = (char) x;
əlavə bitlər atılacaq və nəticə olduqca gözlənilməz olacaq.
Xarakter və tam ədədlərin əlavə edilməsi xüsusiyyətləri
Bu qeyri-adi misala baxaq:public class Main {
public static void main(String[] args) {
char c = '1';
int i = 1;
System.out.println(i+c);
}
}
Konsol çıxışı: 50 O_O Məntiq haradadır? 1+1, 50 haradan gəldi?! Artıq bilirsiniz ki, dəyərlər char
yaddaşda simvolumuzun Unicode kodunu təmsil edən 0-dan 65536-a qədər rəqəmlər şəklində saxlanılır. Beləliklə, budur. Əlavə etdikdə char
və bəzi tam ədədlər char
Unicode-da ona uyğun gələn ədədə çevrilir. Kodumuza 1 və '1' əlavə etdikdə, '1' simvolu onun koduna çevrildi, bu 49 (yuxarıdakı cədvəldə yoxlaya bilərsiniz). Beləliklə, nəticə 50-yə bərabər oldu. Gəlin bir daha köhnə dostumuzu -耰misal götürək və onu hansısa rəqəmlə əlavə etməyə çalışaq.
public static void main(String[] args) {
char c = '耰';
int x = 200;
System.out.println(c + x);
}
Konsolun çıxışı: 33016 Artıq müəyyən etdik ki,耰32816 koduna uyğun gəlir. Və bu rəqəmi və 200-ü əlavə etdikdə tam olaraq nəticəmizi alırıq - 33016 :) İş mexanizmi, gördüyünüz kimi, olduqca sadədir.
GO TO FULL VERSION