أساسيات جافا

المتغيرات وأنواع البيانات الأولية

15 دقيقة الدرس 3 من 14

المتغيرات وأنواع البيانات الأولية

كل برنامج يحتاج إلى تخزين البيانات — عمر مستخدم، ورصيد بنكي، ودرجة امتحان. في Java تُخزَّن البيانات في متغيرات، ولكل متغير نوع يُخبر المُصرِّف بنوع البيانات التي يحتوي عليها. Java لغة ذات تحقق ثابت للأنواع، بمعنى أن النوع محدد وقت الترجمة ولا يمكن تغييره. يُغطّي هذا الدرس الأنواع الأولية الثمانية المدمجة في Java — وهي أصغر وحدات تخزين القيم في اللغة.

ما هو المتغير؟

المتغير هو خانة مسمّاة في الذاكرة. التصريح بمتغير يحجز تلك الخانة؛ والتهيئة تضع فيها قيمة. الصياغة هي:

// تصريح بدون قيمة (يأخذ القيمة الافتراضية إن كان حقلًا، أو يُسبّب خطأ في الترجمة إن كان محليًا) int score; // تصريح وتهيئة في سطر واحد int score = 100;

تشترط Java على المتغيرات المحلية (داخل الدوال) أن تُهيَّأ صراحةً قبل قراءتها. سيرفض المُصرِّف تجميع أي كود قد يقرأ متغيرًا محليًا غير مُهيَّأ.

الأنواع الأولية الثمانية

تمتلك Java بالضبط ثمانية أنواع أولية، مقسَّمة إلى أربع فئات:

1. أنواع الأعداد الصحيحة

تُخزّن هذه الأنواع الأعداد الكاملة. الفارق يكمن في حجم الخانة في الذاكرة وبالتالي مدى القيم التي تسعها.

  • byte — 8 بت. المدى: -128 إلى 127.
  • short — 16 بت. المدى: -32,768 إلى 32,767.
  • int — 32 بت. المدى: -2,147,483,648 إلى 2,147,483,647. النوع الصحيح الاعتيادي.
  • long — 64 بت. المدى: نحو -9.2 × 10¹⁸ إلى 9.2 × 10¹⁸. اللاحقة L مطلوبة لثوابت long.
byte temperature = 36; short year = 2024; int population = 8_000_000_000 / 1000; // فواصل الشرطة السفلية تُحسّن القراءة long distanceKm = 9_460_730_472_580_800L; // الـ L تُشير إلى ثابت long
استخدم int افتراضيًا. الجأ إلى long فقط حين قد تتجاوز القيمة نحو 2.1 مليار (أحجام الملفات، الطوابع الزمنية بالميلي ثانية، المسافات الفلكية). استخدم byte أو short فقط عند العمل مع البيانات الثنائية أو المصفوفات الضخمة جدًا حيث الذاكرة حرجة.

2. أنواع الأعداد العشرية

تُخزّن هذه الأنواع الأعداد ذات الجزء العشري وفق معيار IEEE 754.

  • float — 32 بت، نحو 7 أرقام عشرية ذات معنى. اللاحقة f أو F مطلوبة.
  • double — 64 بت، نحو 15 رقمًا عشريًا ذا معنى. النوع العشري الاعتيادي. لا يحتاج لاحقة؛ ثابت مثل 3.14 هو double بالفعل.
float taxRate = 0.15f; // يجب وضع اللاحقة f double pi = 3.141592653589793; double gravity = 9.81;
لا تستخدم الأعداد العشرية للأموال. 0.1 + 0.2 لا يساوي 0.3 بالضبط في الفاصلة العائمة الثنائية. للحسابات المالية استخدم دائمًا java.math.BigDecimal.

3. نوع الحرف

char يُخزّن حرفًا واحدًا من Unicode في 16 بت (UTF-16). تُحاط ثوابت الحروف بـعلامات اقتباس مفردة.

char grade = 'A'; char newline = '\n'; // تسلسلات الهروب تعمل char heart = '♥'; // ترميز Unicode: ♥
char هو في الأصل عدد صحيح غير منفي بعرض 16 بت (0–65,535) يمثّل نقطة كود Unicode. يمكن إجراء عمليات حسابية عليه، وإن كان ذلك نادر الفائدة: 'A' + 1 يُعطي 66 أي 'B'.

4. نوع المنطق البولياني

boolean يحمل بالضبط إحدى قيمتين: true أو false. وهو نتيجة كل مقارنة وعملية منطقية.

boolean isLoggedIn = true; boolean hasPermission = false; boolean isAdult = (age >= 18); // المقارنة تُنتج boolean

القيم الافتراضية

حين يُصرَّح عن نوع أولي كـحقل في الصف (ليس داخل دالة) دون تهيئة صريحة، تُسنده Java قيمة آمنة افتراضية:

  • byte، short، int، long0
  • float، double0.0
  • char'' (محرف الفراغ الصفري)
  • booleanfalse
المتغيرات المحلية لا تملك قيمة افتراضية. لو صرّحت عن int count; داخل دالة ثم حاولت طباعتها دون إسناد قيمة، لن يُجمَّع الكود. هذا قرار أمان متعمد — Java تمنعك من قراءة بيانات عشوائية خطأً.

الثوابت الحرفية بالتفصيل

الثابت الحرفي (literal) هو قيمة مكتوبة مباشرةً في الكود المصدري. تدعم Java عدة صيغ لتُحسّن قراءة الكود:

// ثوابت صحيحة بقواعد عددية مختلفة int decimal = 255; int hex = 0xFF; // بادئة 0x int binary = 0b1111_1111; // بادئة 0b (Java 7+) int octal = 0377; // الصفر البادئ // فواصل الشرطة السفلية (Java 7+) — يتجاهلها المُصرِّف، رائعة للقراءة int million = 1_000_000; long creditCard = 1234_5678_9012_3456L; // ثوابت عشرية double sci = 1.5e10; // ترميز علمي: 1.5 × 10^10 float small = 3.14f; // String ليس نوعًا أوليًا — بل صف — للإشارة فقط: // String name = "Alice"; <-- علامات اقتباس مزدوجة // char letter = 'A'; <-- اقتباس مفرد (char فقط!)

مثال شامل

هذا برنامج صغير مكتفٍ بذاته يُصرِّح عن متغير واحد من كل نوع أولي ويطبعه:

public class PrimitiveDemo { public static void main(String[] args) { byte b = 100; short s = 30_000; int i = 2_000_000; long l = 9_000_000_000L; float f = 3.14f; double d = 2.718281828; char c = 'J'; boolean flag = true; System.out.println("byte: " + b); System.out.println("short: " + s); System.out.println("int: " + i); System.out.println("long: " + l); System.out.println("float: " + f); System.out.println("double: " + d); System.out.println("char: " + c); System.out.println("boolean: " + flag); } }

الخلاصة

تُغطّي الأنواع الأولية الثمانية في Java كل فئة قيم أساسية: الأعداد الكاملة (byte، short، int، long)، الأعداد العشرية (float، double)، الحرف المفرد (char)، وقيمة الصواب أو الخطأ (boolean). لكل نوع حجم ثابت ومدى محدد وقيمة افتراضية لحقول الصفوف. عند الشك، استخدم int للأعداد الصحيحة وdouble للعشرية — فهما النوعان الاعتياديان في حسابات Java. في الدرس القادم ستجمع هذه القيم بالمعاملات والتعابير لإجراء حسابات حقيقية.