// Java əsasları · Dərs 02
Primitiv verilənlər tipləri və dəyişənlər
Java ədədləri, simvolları və true/false dəyərlərini necə saxlayır, onlara necə ad verilir və necə dəyişdirilir, həmçinin 7 / 2 ifadəsinin nəticəsi niyə 3 olur.
BU DƏRSİN SONUNDA BACARACAQSINIZ
- Java-nın səkkiz primitiv tipini sadalamaq və hər dəyər üçün uyğun tipi seçmək
- Dəyişənləri elan etmək, onlara ilkin dəyər vermək və dəyərini dəyişmək,
finalvəvaraçar sözlərindən istifadə etmək - Tam bölmənin, daşmanın və yuvarlaqlaşdırma xətalarının nəticəsini əvvəlcədən təxmin etmək
- Tiplər arasında çevirmə aparmaq və tip çevirmənin (cast) nə vaxt lazım olduğunu bilmək
- Dəyişəndən kodun harasında istifadə etməyin mümkün olduğunu müəyyən etmək
YADDAŞ
tip · ad · dəyərHissə 1 / 6
Dəyişənlər
Dəyişən (variable) yaddaşda bir dəyər saxlayan adlı yerdir. Java-da hər dəyişənin tipi var və bu tip heç vaxt dəyişmir.
// 1.1
Dəyişən üstündə adı yazılmış qutudur
Dəyişəni elan edəndə (declare) Java yaddaşda bir tipdən olan bir dəyər üçün yer ayırır və ona ad verir. Sətrin istənilən hissəsinə klikləyin.
int age = 25;
Yaddaşda age adlı qutu yaranır. O, bir int dəyəri tutacaq qədər böyükdür və içində 25 var.
= işarəsindən başlayın. Onun mənası riyaziyyatdakı kimi deyil.
int age; // elan: dəyəri yoxdur age = 25; // dəyər mənimsət int year = 2026; // ikisi bir sətirdə
// 1.2
Elan et, mənimsət, dəyiş
Dəyişən eyni anda yalnız bir dəyər saxlayır. Yeni dəyər mənimsədəndə köhnəsi silinir. Kodu sazlayıcıdakı (debugger) kimi addım-addım icra edin və yaddaşı izləyin.
(nəticə burada görünəcək)
Yaddaş
// 1.3
Dəyişənlərə ad vermək
Bəzi adlar ümumiyyətlə kompilyasiya olunmur. Digərləri kompilyasiya olunur, amma bütün Java komandalarının əməl etdiyi razılaşmaları (conventions) pozur. Özünüzü yoxlayın, sonra qaydaları oxuyun.
Bu ad kompilyasiya olunurmu?
Qaydalar
- Hərflə başlayınSonra istənilən hərf, rəqəm,
_və ya$gələ bilər. - Boşluq, simvol və açar söz olmaz
-,+və#olmaz,int,classvə yanewkimi açar sözlər də olmaz. - Böyük və kiçik hərflər fərqlənir
age,AgevəAGEüç fərqli addır. - camelCase, və ad nə saxladığını desin
scvə yaxyox,studentCount. Məntiqi dəyişənin adı sual kimi oxunur:isActive,hasDiscount.
Hissə 2 / 6
Səkkiz primitiv tip
Java-da sadə dəyərlər üçün səkkiz daxili tip var. Qalan hər şey, o cümlədən String, siniflərdən qurulur.
// 2.1
Primitiv tiplər və istinad tipləri
Java-da hər tip bu iki növdən biridir. Fərq dəyişənin əslində nəyi saxlamasındadır.
Primitiv tiplər
Dəyişən dəyərin özünü saxlayır.
- Düz səkkiz dənədir, hamısı kiçik hərflə:
byteshortintlongfloatdoublecharboolean - Hər kompüterdə ölçüsü eynidir:
inthəmişə 32 bitdir - Həmişə dəyəri olur, heç vaxt
nullolmur
İstinad tipləri
Dəyişən istinad (reference) saxlayır: obyektin yaddaşda harada yerləşdiyini.
- Siniflər:
String,Scanner,LocalDatevə sizin yazdığınız hər sinif - Adları böyük hərflə başlayır
nullola bilər, yəni “heç nəyə istinad etmir”
Stek · main metodu
Heap · obyektlər
1-ci dərsdəki stek və heap-i xatırlayırsınız? Primitiv dəyərlər birbaşa metodun stek çərçivəsində (stack frame) yerləşir. Obyektlər heap-də yaşayır, dəyişən isə onlara yalnız istinad saxlayır.
String primitiv deyil, sinifdir, amma Java ona xüsusi yanaşır: "text" literalları yaza və sətirləri + ilə birləşdirə bilərsiniz. Sətirlərə 7-ci dərsdə baxacağıq. Hər primitiv tipin həm də sinif cütü var, ona wrapper (bükücü sinif) deyilir: int → Integer, double → Double, char → Character. Onlar sonra kolleksiyalar üçün lazım olacaq.
// 2.2
Səkkiz tiplə tanışlıq
Dördü tam ədədlər, ikisi kəsr ədədlər, biri simvollar, biri də true/false üçündür. Zolaqlar hər birinin nə qədər yaddaş tutduğunu göstərir. Bir tipə klikləyin.
Praktikada sizə ikisi lazımdır: tam ədədlər üçün int, kəsr ədədlər üçün double. Digərlərinə yalnız səbəb olanda müraciət edin, məsələn 2,1 milyarddan böyük ədədlər üçün long.
// 2.3
Dəyərlərin yazılışı: literallar
Literal kodda birbaşa yazılmış dəyərdir. Onu necə yazmağınız tipini müəyyən edir.
| Literal | Tip | Mənası |
|---|---|---|
42 | int | Hər tam ədəd standart olaraq int tipindədir |
42L | long | L onu long edir. Böyük L yazın: kiçik l hərfi 1 rəqəminə oxşayır |
3.14 | double | Nöqtəli hər ədəd standart olaraq double tipindədir |
3.14f | float | f onu float edir |
1_000_000 | int | Alt xətlər böyük ədədləri oxunaqlı edir. Java onlara məhəl qoymur |
1.5e3 | double | Elmi yazılış: 1,5 × 10³ = 1500.0 |
0xFF · 0b1010 | int | On altılıq (255) və ikilik (10) say sistemi |
'A' | char | Tək dırnaq, düz bir simvol |
'\n' · '\t' | char | Xüsusi simvollar (escape sequences): yeni sətir, tab. Həmçinin '\'' və '\\' |
'\u0041' | char | Unicode kodu, burada 'A' |
true | boolean | Və ya false. Həmişə kiçik hərflə |
"A" | String | Qoşa dırnaq String deməkdir, hətta bir simvol üçün də |
010 | int | Tələ: əvvəldəki sıfır səkkizlik say sistemi deməkdir. Bu 10 yox, 8 ədədidir |
// 2.4
Düzgün tipi seçin
Real verilənlər, real seçimlər. Hər dəyər üçün bir tip seçin.
Hissə 3 / 6
Ədədlər necə davranır
Tam bölmə (integer division), daşma və yuvarlaqlaşdırma xətaları: real proqram xətalarının çoxunun arxasında dayanan üç sürpriz.
// 3.1
7 / 2 niyə 3 olur
Nəticənin tipi ədədlərin tiplərindən asılıdır. Bunu məşq JShell-ində yoxlayın: hesablamanı yazıb Enter basın və ya təkliflərdən birinə klikləyin.
- int ilə int nəticədə int verirKəsr hissə yuvarlaqlaşdırılmır, sadəcə atılır:
7 / 2nəticəsi3,-7 / 2nəticəsi isə-3olur. - Bir double hər şeyi double edir
7.0 / 2və7 / 2.0ifadələrinin hər ikisi3.5verir. %qalığı verir7 % 2nəticəsi1olur. Cüt və tək ədədləri yoxlamaq üçün əlverişlidir.- Sıfıra bölmə
intilə proqram xəta verib dayanır.doubleilə isəInfinityvə yaNaNalırsınız.
BUNLARI YOXLAYIN
// 3.2
Daşma (overflow): ədəd dövrə vuranda
Hər tam ədəd tipinin sabit sayda biti var. Ən böyük dəyəri keçsəniz, ədəd ən kiçik dəyərə qayıdır: nə xəta, nə də xəbərdarlıq olur. Budur byte: 8 bit. Bitlərə klikləyin və ya +1 ilə sayın.
Ən soldakı bit +128 yox, −128 kimi sayılır. Java mənfi ədədləri belə saxlayır (bu üsul two’s complement adlanır). int da eyni qaydada işləyir, sadəcə 32 bitlə.
int max = Integer.MAX_VALUE; // 2147483647 System.out.println(max + 1); // -2147483648 // Səssiz daşma yox, xəta istəyirsiniz? Math.addExact(max, 1); // ArithmeticException: integer overflow
// YouTube, 2014
“Gangnam Style” sayğacı sındırdı
Video 2 147 483 647 baxışı keçdi. Bu, 32 bitlik int-in ən böyük dəyəridir. YouTube baxış sayğacını 64 bitlik tam ədədə keçirməli oldu.
// Boeing 787, 2015
Hər 248 gündən bir yenidən başlatma
Təyyarənin generator idarəetmə bloklarındakı sayğac saniyənin yüzdə birlərini sayırdı. 2³¹ belə vahiddən, yəni təxminən 248 gündən sonra o daşar və elektrik enerjisini söndürərdi. Düzəliş çıxana qədər aviaşirkətlər təyyarələri müntəzəm olaraq yenidən başlatmalı idilər.
// 3.3
0.1 + 0.2 niyə 0.3 deyil
double sürüşən nöqtəli ədəddir (floating-point) və ədədləri ikilik say sistemində saxlayır. 0,1 kimi onluq kəsrlərin çoxunun dəqiq ikilik forması yoxdur, eynilə 1/3-ün dəqiq onluq forması olmadığı kimi (0,333…). Kiçik yuvarlaqlaşdırma xətaları yaranır və toplanır.
System.out.println(0.1 + 0.2); System.out.println(1.1 * 3); System.out.println(0.1 + 0.2 == 0.3);
$ java Main
0.30000000000000004
3.3000000000000003
false
0.1-i on dəfə toplayın
Ölçmələr üçün yararlıdır
Temperatur, məsafə, orta qiymət, faiz. 17-ci rəqəmdəki xəta önəmli deyil, double isə sürətlidir.
Pul üçün heç vaxt
Milyonlarla ödənişin hər birində qəpiyin kiçik bir hissəsi itərsə, yekun məbləğlər üst-üstə düşmür. Banklar pulu dəqiq sayır: long içində tam sayda qəpik kimi, ya da dəqiq onluq hesablamalar üçün nəzərdə tutulmuş BigDecimal sinfi ilə.
long priceInQepik = 1249; // 12.49 AZN
Hissə 4 / 6
Tiplər arasında çevirmə
Bəzən Java dəyəri sizin əvəzinizə özü çevirir. Bəzən isə bunu tip çevirmə (casting) ilə özünüz istəməli və verilənlərin itə biləcəyini qəbul etməlisiniz.
// 4.1
Genişləndirici və daraldıcı çevirmə
Kiçik tipdən böyük tipə Java avtomatik çevirir: bu, genişləndirici çevirmədir (widening). Böyükdən kiçiyə isə (int) kimi cast yazmalısınız: bu, daraldıcı çevirmədir (narrowing) və verilənlər itə bilər.
və char → int. Oxlar istiqamətində çevirmə avtomatikdir, hətta bir neçə addım olsa belə: byte → double da işləyir.
Hansı tipdən
Hansı tipə
// 4.2
Tip çevirmə: nəticəni təxmin edin
Cast dəyərin qarşısında mötərizədə yazılan tipdir. Klikləməzdən əvvəl JShell-in nə çap edəcəyini təxmin edin.
Kəsmək yox, yuvarlaqlaşdırmaq istəyirsiniz? Math.round(3.99) nəticədə 4 verir.
Hissə 5 / 6
Proqramınızda dəyişənlər
Sabitlər, tipin Java tərəfindən seçilməsi və hər dəyişəndən kodun harasında istifadə etmək olar.
// 5.1
final və var
Dəyişənin qarşısına yazılan iki açar söz: biri dəyəri kilidləyir, digəri tipi kompilyatorun özünə müəyyən etdirir.
final: bir dəfə verilir, heç vaxt dəyişmir
Sabitləri UPPER_SNAKE_CASE ilə adlandırın. Onlar “sehrli ədədləri” (magic numbers) əvəz edir: price * VAT_RATE yazısı 0.18 ədədinin nə demək olduğunu izah edir.
$ javac Main.java Main.java:9: error: cannot assign a value to final variable VAT_RATE VAT_RATE = 0.20; ^ 1 error
var: tipi Java seçir
Java 10-dan bəri lokal dəyişən üçün tip əvəzinə var yazmaq olar. Kompilyator dəyəri oxuyur və tipi təyin edir. Hər sətir hansı tipi alır?
- Tip yenə də sabitdir.
var count = 10;yazdıqdan sonracount = "ten";xəta verir: String int-ə çevrilə bilməz. - Dəyər tələb edir.
var total;kompilyasiya olunmur. - Yalnız lokal dəyişənlər üçündür, metodların daxilində.
Öyrənərkən tipləri açıq yazın. Bu, sizi onlar haqqında düşünməyə alışdırır. var açar sözünü sonra, tip sağ tərəfdən aydın görünəndə istifadə edin.
// 5.2
Görünmə sahəsi (scope): dəyişən harada yaşayır
Dəyişən elan olunduğu sətirdən öz blokunu bağlayan } mötərizəsinə qədər mövcuddur. Bu blokdan kənarda Java onu tanımır. Görünmə sahəsini görmək üçün bir dəyişən seçin.
Görünmə sahəsi qaydaları
- Daxili bloklar xarici blokların dəyişənlərini görür. Xarici kod isə içəridəkiləri görmür.
- İki ayrı blokun hər birində eyni adlı öz dəyişəni ola bilər.
- Bir metodun daxilində eyni ad iki dəfə elan oluna bilməz, hətta daxili blokda da.
- Görünmə sahəsini kiçik saxlayın: dəyişəni ona ehtiyac olan yerdən dərhal əvvəl elan edin.
if öz blokunu yalnız şərt doğru olanda icra edir. Onu 4-cü dərsdə ətraflı öyrənəcəksiniz.
// 5.3
Qəsdən sındırın
Bu dərsdəki tip yoxlamaları kompilyasiya zamanı aparılır, ona görə javac onları proqram işə düşməzdən əvvəl tutur. Real xəta mesajını və onun necə düzəldildiyini görmək üçün bir səhv seçin.
Hissə 6 / 6
Yekun
Nələri yadda saxlamalı, özünüzü yoxlamaq üçün test və ev tapşırığı.
// 6.1
Əsas nəticələr
Dəyişənin tipi, adı və dəyəri var. Dəyər dəyişə bilər, tip isə heç vaxt dəyişmir.
finaldəyəri də kilidləyir.Java-da səkkiz primitiv tip var. Xüsusi səbəb yoxdursa, tam ədədlər üçün
int, kəsr ədədlər üçündoubleistifadə edin.Tam ədəd literalları
int, kəsr literalları isədoubletipindədir. long üçünL, float üçünfəlavə edin.int / intkəsr hissəni atır, tam ədədlər isə daşanda səssizcə dövrə vurur.doubletipində kiçik yuvarlaqlaşdırma xətaları olur. Onu heç vaxt pul üçün istifadə etməyin.Genişləndirici çevirmə avtomatikdir. Daraldıcı çevirmə cast tələb edir və verilənləri itirə bilər. Lokal dəyişən istifadədən əvvəl dəyər almalıdır və yalnız öz blokunda yaşayır.
// 6.2
Özünüzü yoxlayın
On sual. Seçim etdikdən dərhal sonra cavabı görürsünüz.
// 6.3
Ev tapşırığı
Bitirdikcə tapşırıqları işarələyin. İşarələriniz yalnız bu brauzerdə saxlanılır.
// 6.4
Suallar?
Növbəti dərs: Operatorlar və ifadələr. Hesab, müqayisə, məntiqi və bit operatorları, həmçinin x++ ilə ++x ifadələrinin niyə eyni olmadığı.
int a = 10, b = 3; System.out.println(a % b); // 1 System.out.println(a > b && b > 0); // true int x = 5; System.out.println(x++ + ++x); // ?