1. Qeyri-açıq (avtomatik) tip çevrilməsi
Java-da (başqa dillərdə olduğu kimi) dəyişənlərin dəqiq tipi var — əgər dəyişən int kimi elan edilibsə, yalnız tam ədədləri, əgər double kimi elan edilibsə — yalnız üzən nöqtəli ədədləri saxlaya bilər. Lakin real proqramlarda tez-tez elə vəziyyət yaranır ki, dəyəri bir dəyişəndən başqa tipli dəyişənə «köçürmək» lazım olur. Məsələn:
- Metoddan int aldıq, amma onu kəsrli hesablamalar üçün double kimi istifadə etmək istəyirik.
- Simvolun kodunu ədəd kimi (int) saxlayırıq, amma simvolun özünü (char) almaq istəyirik.
- Hesablamanın nəticəsi double-dır, lakin bizə tam nəticə (int) lazımdır, məsələn, bütöv almaların sayını çıxarmaq üçün.
Java-da iki əsas çevirmə yolu var: qeyri-açıq (avtomatik) və açıq (əl ilə).
Bu nədir?
Qeyri-açıq çevrilmə — bu, Java-nın özü, «sizin iştirakınız olmadan», dəyəri bir tipdən digərinə çevirdiyi haldır; əgər bu təhlükəsizdirsə və məlumat itkisi baş vermirsə.
Bu, daha kiçik tipli dəyəri daha böyük tipli dəyişənə təyin etdikdə baş verir. Məsələn, int-dən double-a, char-dan int-ə, float-dan double-a.
Analoji: Təsəvvür edin ki, sizdə bir stəkan su var (int) və bir vedrə (double). Suyu stəkandan vedrəyə töksəniz — heç nə dağılmayacaq, hər şey sığacaq. Java belə hallarda avtomatik çevrilməyə icazə verir.
Nümunə: int → double
int apples = 5;
double applesWeight = apples; // int avtomatik olaraq double-a çevrilir
System.out.println(applesWeight); // 5.0
Nümunə: char → int
Java-da hər bir simvol — Unicode cədvəlindəki sadəcə bir ədəddir. Buna görə də char-dan int-ə çevrilmə avtomatik baş verir:
char letter = 'A';
int code = letter; // 'A' 65-ə çevrilir (Unicode-da simvolun kodu)
System.out.println(code); // 65
Qeyri-açıq çevrilmələrin cədvəli
| Haradan | Qeyri-açıq çevrilmə hara mümkündür |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Vacibdir: Qeyri-açıq çevrilmə yalnız «genişlənmə» istiqamətində işləyir (kiçikdən böyüyə).
2. Açıq (əl ilə) tip çevrilməsi (type casting)
Açıq çevrilmə siz dəyəri böyük tipdən kiçik tipə və ya uyğun olmayan tiplər arasında çevirmək istəyəndə tələb olunur. Bu halda Java mümkün məlumat itkisini dərk etdiyinizi açıq şəkildə göstərməyinizi tələb edir.
Analoji: Suyu vedrədən (double) stəkana (int) tökməyə çalışırsınız — suyun bir hissəsi dağılacaq və Java sizdən bunu deməyinizi tələb edir: «Bəli, mən başa düşürəm ki, məlumatın bir hissəsi itə bilər!»
Sintaksis
tip_naznacheniya peremennaya = (tip_naznacheniya) vyrazhenie;
Nümunə: double → int
double price = 12.99;
int roundedPrice = (int) price; // onluq hissə sadəcə kəsilir!
System.out.println(roundedPrice); // 12
Diqqət: Yuvarlaqlaşdırma baş vermir! Sadəcə nöqtədən sonrakı hissə «kəsilir». Yuvarlaqlaşdırma üçün Math.round() istifadə edin.
Nümunə: int → char
int code = 66;
char letter = (char) code; // 66 — bu, 'B' simvoludur
System.out.println(letter); // B
Nümunə: double → float
double d = 3.1415926535;
float f = (float) d; // dəqiqliyin bir hissəsi itirilir
System.out.println(f); // 3.1415927 (vergüldən sonra daha az rəqəm)
3. Rəqəmlər və simvollar arasında çevrilmə (char və rəqəmlər)
Niyə bu mümkündür?
Java-da simvollar (char) əslində — Unicode cədvəlindəki sadəcə ədədlərdir. Buna görə onları int-ə və əksinə sərbəst çevirmək olar.
Nümunə: char → int
char ch = '\u0416';
int code = ch;
System.out.println(code); // 1046
Nümunə: int → char
int code = 8364;
char symbol = (char) code;
System.out.println(symbol); // €
Təcrübə: əlifbanı çıxaraq
for (int i = 65; i < 65 + 26; i++) {
System.out.print((char) i + " ");
}
// Çap edəcək: A B C D ... Z
4. Tam və onluq ədədlər arasında çevrilmə
int → double (qeyri-açıq)
int count = 10;
double avg = count; // qeyri-açıq genişlənmə
System.out.println(avg); // 10.0
double → int (açıq)
double score = 8.75;
int rounded = (int) score;
System.out.println(rounded); // 8
Riyazi qaydalarla necə yuvarlaqlaşdırmaq olar?
Əgər sadəcə onluq hissəni «kəsmək» yox, ən yaxın tam ədədə yuvarlaqlaşdırmaq lazımdırsa, Math.round() istifadə edin:
double price = 8.75;
int rounded = (int) Math.round(price);
System.out.println(rounded); // 9
5. Tip «daraldıqda» nə baş verir? Məlumat itkisi
Nümunə: int → byte
int big = 300;
byte small = (byte) big;
System.out.println(small); // 44 (!)
Niyə 44? Çünki byte -128-dən 127-yə qədər dəyərləri saxlayır və ədəd sığmayanda — 256 modulu üzrə «kəsilmə» baş verir (bölmədən qalan qalır).
Nümunə: double → int
double d = 1e20;
int i = (int) d;
System.out.println(i); // -2147483648 (int üçün minimal dəyər)
Böyük ədəd int diapazonuna sığmır və nəticə «qəribə» olur.
6. Hesablamalarda çevrilmə: «qarışıq» tiplər
Nümunə: int + double
int a = 3;
double b = 2.5;
double result = a + b; // int avtomatik olaraq double-a çevriləcək
System.out.println(result); // 5.5
Nümunə: char + int
char ch = 'A'; // 65
int offset = 2;
char next = (char) (ch + offset); // char avtomatik olaraq int-ə çevriləcək
System.out.println(next); // C
7. Rəqəmlərlə sətirlər arasında çevrilmə
Bu tam olaraq «tip çevrilməsi» olmasa da, tez-tez ədədi sətrə və əksinə çevirmək lazım olur.
int → String
int x = 123;
String s = Integer.toString(x);
// və ya sadəcə: String s = "" + x;
String → int
String s = "456";
int x = Integer.parseInt(s);
8. Tipik səhvlər və nüanslar
Səhv №1: double → int zamanı onluq hissənin itməsi. Çox vaxt yeni başlayanlar düşünür ki, (int) 3.99 nəticə 4 verəcək. Əslində nəticə — 3-dür, onluq hissə sadəcə atılır. Düzgün yuvarlaqlaşdırma üçün Math.round() istifadə edin.
Səhv №2: Qeyri-açıq «daralma» işləmir. Sadəcə belə yazmaq olmaz: int x = 300; byte b = x; — kompilyator səhv verəcək. Açıq şəkildə (byte) x göstərməlisiniz, lakin ədəd byte diapazonundan böyükdürsə, qəribə nəticələrə hazır olun.
Səhv №3: Uyğun olmayan tiplər arasında çevrilmə. (int) "123" yazmaq olmaz — sətirdən ədədə çevrilməni Integer.parseInt() vasitəsilə edin.
Səhv №4: char və int ilə problemlər. int-dən char-a çevrilmə yalnız Unicode-da həqiqətən mövcud olan dəyərlər üçün işləyir. Çox böyük ədəd versəniz, nəticədə gözlənilməz simvol alınacaq.
Səhv №5: İfadələrdə qarışıq tiplər. Əgər ifadədə int və double varsa, nəticə həmişə double olacaq. Bu, əgər siz tam ədəd gözləyirsinizsə, proqramın məntiqinə gözlənilmədən təsir edə bilər.
Səhv №6: Yuvarlaqlaşdırma — tip çevrilməsi deyil! (int) x — yuvarlaqlaşdırma deyil, sadəcə onluq hissəni atmaqdır. Yuvarlaqlaşdırma üçün Math.round() istifadə edin.
GO TO FULL VERSION