JAVA ƏSASLARIDərs 02
Primitiv verilənlər tipləri və dəyişənlər

// 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, final və var aç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
Main.java

          
Proqramı sətir-sətir izləmək üçün «İşə sal» düyməsini basın.

YADDAŞ

tip · ad · dəyər

Hissə 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.

Main.java
int age = 25;
int · 32 bitage25

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.

Yazmağın üç yolu
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.

main(…) daxilində

        
(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, class və ya new kimi açar sözlər də olmaz.
  • Böyük və kiçik hərflər fərqlənirage, Age və AGE üç fərqli addır.
  • camelCase, və ad nə saxladığını desinsc və ya x yox, 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ə: byte short int long float double char boolean
  • Hər kompüterdə ölçüsü eynidir: int həmişə 32 bitdir
  • Həmişə dəyəri olur, heç vaxt null olmur

İstinad tipləri

Dəyişən istinad (reference) saxlayır: obyektin yaddaşda harada yerləşdiyini.

  • Siniflər: String, Scanner, LocalDate və sizin yazdığınız hər sinif
  • Adları böyük hərflə başlayır
  • null ola bilər, yəni “heç nəyə istinad etmir”
Stek · main metodu
int age25
double gpa3.7
String name● ──→
Heap · obyektlər
String obyekti"Aysel"

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.

LiteralTipMənası
42intHər tam ədəd standart olaraq int tipindədir
42LlongL onu long edir. Böyük L yazın: kiçik l hərfi 1 rəqəminə oxşayır
3.14doubleNöqtəli hər ədəd standart olaraq double tipindədir
3.14ffloatf onu float edir
1_000_000intAlt xətlər böyük ədədləri oxunaqlı edir. Java onlara məhəl qoymur
1.5e3doubleElmi yazılış: 1,5 × 10³ = 1500.0
0xFF · 0b1010intOn altılıq (255) və ikilik (10) say sistemi
'A'charTək dırnaq, düz bir simvol
'\n' · '\t'charXüsusi simvollar (escape sequences): yeni sətir, tab. Həmçinin '\'' və '\\'
'\u0041'charUnicode kodu, burada 'A'
truebooleanVə ya false. Həmişə kiçik hərflə
"A"StringQoşa dırnaq String deməkdir, hətta bir simvol üçün də
010intTə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.

jshell — məşq
  • int ilə int nəticədə int verirKəsr hissə yuvarlaqlaşdırılmır, sadəcə atılır: 7 / 2 nəticəsi 3, -7 / 2 nəticəsi isə -3 olur.
  • Bir double hər şeyi double edir7.0 / 2 və 7 / 2.0 ifadələrinin hər ikisi 3.5 verir.
  • % qalığı verir7 % 2 nəticəsi 1 olur. Cüt və tək ədədləri yoxlamaq üçün əlverişlidir.
  • Sıfıra bölməint ilə proqram xəta verib dayanır. double ilə isə Infinity və ya NaN alı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.

byte dəyəri
0

Ə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ə.

Eyni şey int ilə
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.

Main.java
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.

byteshortintlongfloatdouble

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.

main(…) daxilində

          
$ 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?

Main.java

        
  • Tip yenə də sabitdir. var count = 10; yazdıqdan sonra count = "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.

Main.java

          

        

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.

Main.java

          

        

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

  1. Dəyişənin tipi, adı və dəyəri var. Dəyər dəyişə bilər, tip isə heç vaxt dəyişmir. final dəyəri də kilidləyir.

  2. Java-da səkkiz primitiv tip var. Xüsusi səbəb yoxdursa, tam ədədlər üçün int, kəsr ədədlər üçün double istifadə edin.

  3. Tam ədəd literalları int, kəsr literalları isə double tipindədir. long üçün L, float üçün f əlavə edin.

  4. int / int kəsr hissəni atır, tam ədədlər isə daşanda səssizcə dövrə vurur.

  5. double tipində kiçik yuvarlaqlaşdırma xətaları olur. Onu heç vaxt pul üçün istifadə etməyin.

  6. 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.

Nəticəniz
0 / 10
Yuxarıdakı suallara cavab verin.

// 6.3

Ev tapşırığı

Bitirdikcə tapşırıqları işarələyin. İşarələriniz yalnız bu brauzerdə saxlanılır.

Hazırdır: 0 / 6

// 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ığı.

Dərs 03: ön baxış
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);      // ?