טיפוסים פרימיטיביים
מה זה טיפוס פרימיטיבי?
טיפוס פרימיטיבי (primitive type) הוא אבן הבניין הבסיסית של נתונים ב-Java - לא אובייקט, אלא ערך פשוט שיושב ישירות בזיכרון. ב-Java יש בדיוק 8 טיפוסים פרימיטיביים, וכדאי להכיר את כולם.
טבלת הטיפוסים
| טיפוס | גודל | טווח | ברירת מחדל |
|---|---|---|---|
byte |
1 בייט (8 ביט) | -128 עד 127 | 0 |
short |
2 בייט | -32,768 עד 32,767 | 0 |
int |
4 בייט | -2,147,483,648 עד 2,147,483,647 | 0 |
long |
8 בייט | ±9.2 * 10^18 | 0L |
float |
4 בייט | 7 ספרות משמעותיות | 0.0f |
double |
8 בייט | 15 ספרות משמעותיות | 0.0 |
char |
2 בייט | תו Unicode אחד | '\u0000' |
boolean |
1 ביט (מוגדר) | true / false |
false |
4 טיפוסי מספר שלם
byte - קטן מאוד
byte b = 100;
מתאים כשרוצים לחסוך בזיכרון או לעבוד עם נתונים בינאריים.
short - קטן
short s = 30000;
כמעט לא בשימוש יומיומי - תפגשו אותו בעיקר ב-OpenGL ובהקשרים דומים.
int - הנפוץ ביותר
int number = 1000000;
הבחירה הטבעית כשצריך מספר שלם - השתמשו בו כברירת מחדל.
long - גדול מאוד
long bigNumber = 9999999999L; // חייב L בסוף!
בא לידי שימוש כשהמספרים חורגים מטווח ה-int - חותמות זמן, מזהים וכדומה.
2 טיפוסי מספר עשרוני
float - פחות מדויק
float price = 9.99f; // חייב f בסוף!
double - הנפוץ ביותר
double pi = 3.14159265358979;
הבחירה הטבעית למספרים עשרוניים - השתמשו בו כברירת מחדל.
למה צריך f ו-L? כברירת מחדל Java מתייחסת ל-9.99 כ-double
ול-9999999999 כ-int. הסיומות הן הדרך לומר לקומפיילר שהכוונה שונה.
טיפוס התו
char - תו יחיד
char letter = 'A'; // גרשיים בודדים!
char digit = '5';
char hebrew = 'ש';
char unicode = '\u05E9'; // ש (בעברית)
חשוב: char נכתב בגרשיים בודדים ('A'), ואילו
String בגרשיים כפולים ("A"). הערבוב בין השניים הוא טעות נפוצה מאוד.
מתחת לפני השטח char ב-Java הוא פשוט מספר - קוד ה-Unicode של התו - ולכן אפשר להמיר
בקלות בין השניים:
int code = 'A'; // 65
char ch = 65; // 'A'
טיפוס בוליאני
boolean
boolean isReady = true;
boolean isDone = false;
בניגוד לשפת C, ב-Java אי אפשר להמיר boolean למספר ולהיפך.
ברירות מחדל
שדה במחלקה שלא אותחל במפורש מקבל אוטומטית ערך ברירת מחדל:
public class Defaults {
int number; // 0
double value; // 0.0
boolean flag; // false
char ch; // '\u0000'
String text; // null (לא פרימיטיבי)
}
שימו לב - הכלל הזה לא חל על משתנים מקומיים! משתנה מקומי חייב אתחול מפורש, ושימוש בו לפני שהוצב בו ערך גורר שגיאת קומפילציה.
המרות בין טיפוסים
המרה אוטומטית (widening)
מעבר מטיפוס קטן לטיפוס גדול יותר קורה מעצמו, בלי שתצטרך לעשות דבר:
int i = 100;
long l = i; // אוטומטי
double d = l; // אוטומטי
סדר הגדלים: byte → short → int → long → float → double
המרה מפורשת (casting)
בכיוון ההפוך, מטיפוס גדול לקטן, חובה לציין casting במפורש:
double d = 3.99;
int i = (int) d; // 3 (נחתך החלק העשרוני)
זהירות: casting כזה עלול לגרום לאובדן מידע.
int big = 300;
byte b = (byte) big; // -56 (גלישה!)
מחלקות עוטפות (Wrapper Classes)
לצד כל טיפוס פרימיטיבי קיימת מחלקה מקבילה שעוטפת אותו:
| פרימיטיבי | עוטפת |
|---|---|
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
boolean |
Boolean |
הן נחוצות בכל מקום שדורש אובייקט - למשל באוספים, שבהם כותבים
List<Integer> ולא List<int>.
int number = Integer.parseInt("42");
double value = Double.parseDouble("3.14");
String str = Integer.toString(100);
בדקו את עצמכם
נסו לענות לבד לפני שאתם פותחים את התשובה.
-
כמה טיפוסים פרימיטיביים יש ב-Java?
הצגת התשובה
תשובה ד. byte, short, int, long, float, double, char ו-boolean.
-
למה
float price = 9.99;לא מתקמפל?הצגת התשובה
תשובה א. Java מתייחסת ל-9.99 כ-double. המרה ל-float עלולה לאבד דיוק, ולכן צריך לסמן אותו במפורש עם f.
-
איך כותבים תו בודד מסוג
char?הצגת התשובה
תשובה ב. char נכתב בגרשיים בודדים. גרשיים כפולים יוצרים String.