الكلية الجامعية للعلوم التطبيقيةبرمجة 1
English
المحاضرة 2 · 100 دقيقة

التعليقات في جافا

ملاحظات نكتبها للبشر داخل الكود، ويتجاهلها المترجم

إعداد: م. بدر الدين محمد الحليمي · م. محمد زهير كحيل

في نهاية هذه المحاضرة ستكون قادرًا على

  1. تشرح وظيفة التعليق ولماذا يتجاهله المترجم
  2. تكتب تعليق سطر واحد وتعليق عدة أسطر
  3. تكتب تعليق توثيق بوسوم الكاتب والإصدار والتاريخ
  4. تكتشف خطأ تعليق غير مغلق وتصححه
  5. تطبع نصوصًا منسقة باستخدام رموز الهروب
محتويات المحاضرة
  1. التعليق يجعل الكود مفهومًا لمن يقرؤه بعدك
  2. التعليق ملاحظة داخل الكود يتجاهلها المترجم
  3. التعليق يشرح الكود، ويذكّرك بفكرتك، ويوقف سطرًا مؤقتًا
  4. التعليقات تبقى في الكود عالي المستوى، ولا تصل إلى لغة الآلة
  5. تعليق السطر الواحد يبدأ بـ // ويتوقف عند نهاية السطر
  6. تعليق الأسطر المتعددة يشرح فقرة كاملة أو يوقف عدة أسطر
  7. تعليق التوثيق يصف البرنامج بوسوم تقرؤها أداة javadoc
  8. في NetBeans نكتب تعليق التوثيق وننشئ صفحاته بأمر واحد
  9. ثلاثة أنواع من التعليقات، ولكل نوع استخدام
  10. الرمز // داخل علامات التنصيص نص يُطبع، وليس تعليقًا
  11. تعليق الأسطر المتعددة بلا إغلاق يحوّل باقي الملف إلى تعليق
  12. التعليق الجيد يشرح سبب الكود، ولا يكرر ما يقوله
  13. رموز الهروب تبدأ بشرطة مائلة عكسية، وتطبع ما لا نكتبه مباشرة
  14. الدالة print لا تنتقل إلى سطر جديد، و\" لا تغلق النص
  15. تمرين ختامي: وثّق برنامجك واطبع بطاقة تعريف
  16. أسئلة المراجعة
الجزء الأول: التعليقات

التعليق يجعل الكود مفهومًا لمن يقرؤه بعدك

كود بلا تعليقات

double نوع يحمل عددًا عشريًا، وسنشرحه في المحاضرة القادمة. يكفي الآن أن a وb اسمان يحملان عددين.

public class Mystery {
    public static void main(String[] args) {
        double a = 4.5;
        double b = 2;
        System.out.println(a * b / 2);
    }
}
الناتج
4.5

الكود نفسه مع تعليقات

شغّل البرنامج، ثم اضغط «تتبّع سطرًا سطرًا» واضغط «السطر التالي» عدة مرات. لاحظ أن التحديد يتخطى سطر التعليق، لأنه لا شيء فيه يُنفَّذ.

public class Triangle {
    public static void main(String[] args) {
        // area of a triangle
        double a = 4.5; // base
        double b = 2;   // height
        System.out.println(a * b / 2);
    }
}
الناتج
4.5

التعليق لا يغيّر عمل البرنامج: الكودان يطبعان 4.5، لكن الثاني أسرع فهمًا.

التعليق ملاحظة داخل الكود يتجاهلها المترجم

التعليق نص نكتبه داخل البرنامج لنشرح ما يفعله الكود. المترجم لا يترجمه ولا ينفّذه، ويتجاهل كل حرف داخله مهما كان مكتوبًا فيه.

سطر واحد

يستمر حتى نهاية السطر.

// comment
عدة أسطر

يمتد على سطر أو أكثر.

/* comment */
توثيق

تقرؤه أداة javadoc.

/** comment */

داخل التعليق كود صحيح وآخر غير مفهوم. ماذا يطبع البرنامج؟

public class Ignored {
    public static void main(String[] args) {
        // System.out.println("Hidden"); @#$ 123 nonsense
        System.out.println("Shown");
    }
}
أظهر الناتج
الناتج
Shown

لماذا؟ كل ما بعد // على ذلك السطر يتجاهله المترجم، ولذلك لا يرفض الرموز الغريبة ولا ينفّذ أمر الطباعة.

التعليق يشرح الكود، ويذكّرك بفكرتك، ويوقف سطرًا مؤقتًا

شرح الكود

يفهم زملاؤك ومدرّسك ماذا يفعل كل جزء.

تذكير لنفسك

تعود إلى برنامجك بعد أسابيع فتفهمه بسرعة.

إيقاف مؤقت

تحوّل سطرًا إلى تعليق لتجرب البرنامج بدونه.

التعليق للبشر فقط: البرنامج يعمل بالطريقة نفسها مع التعليقات وبدونها.

أوقف السطر الأوسط

دون حذف أي شيء، حوّل السطر الذي يطبع Two إلى تعليق حتى لا يُطبع.

public class Pause {
    public static void main(String[] args) {
        System.out.println("One");
        System.out.println("Two");
        System.out.println("Three");
    }
}
الناتج المتوقع
One
Three
تلميح 1

اكتب // في بداية السطر. وفي NetBeans يكفي تحديد السطر والضغط على Ctrl + /.

الحل
public class Pause {
    public static void main(String[] args) {
        System.out.println("One");
        // System.out.println("Two");
        System.out.println("Three");
    }
}

التعليقات تبقى في الكود عالي المستوى، ولا تصل إلى لغة الآلة

تذكير: يمر برنامجك بثلاثة مستويات قبل أن ينفّذه المعالج.

المستوىمثالوصفه
عالي المستوى (High-level)Javaنكتبه نحن، وفيه التعليقات
منخفض المستوى (Low-level)LOADقريب من المعالج، بلا تعليقات
لغة الآلة (Machine code)0101أصفار وآحاد ينفّذها المعالج

المترجم يحذف التعليقات أثناء الترجمة، فلا تصل إلى ملف .class، ولذلك لا تؤثر في سرعة البرنامج ولا في حجمه بعد الترجمة.

ماذا ينتج javac من ملف فيه تعليقات؟

تعليق السطر الواحد يبدأ بـ // ويتوقف عند نهاية السطر

  1. اكتب الكود وشغّلهفي المختبر اضغط F6، وهنا زر «تشغيل» أو Ctrl+Enter.
  2. توقّع: هل يظهر التعليق في الناتج؟
  3. احذف // من السطر الثالث وشغّل
  4. فسّر رسالة الخطأ، ثم أعد //
public class Comments {
    public static void main(String[] args) {
        // print a welcome message
        System.out.println("Welcome");
        int x = 5; // comment after code
        System.out.println(x);
    }
}
الناتج
Welcome
5

حذفنا //

هذه نتيجة الخطوة الثالثة: صار التعليق كودًا. أعد الرمز // إلى بداية السطر.

public class Comments {
    public static void main(String[] args) {
        print a welcome message
        System.out.println("Welcome");
        int x = 5; // comment after code
        System.out.println(x);
    }
}
رسالة المترجم';' expected
أظهر التصحيح
public class Comments {
    public static void main(String[] args) {
        // print a welcome message
        System.out.println("Welcome");
        int x = 5; // comment after code
        System.out.println(x);
    }
}
الناتج
Welcome
5

لماذا؟ بدون // يقرأ المترجم الكلمات على أنها كود. وتبدو رسالته بعيدة عن السبب الحقيقي، فهو لا يعرف أنك أردت تعليقًا، ويشتكي فقط من أن الكلمات لا تكوّن تعليمة صحيحة.

تعليق الأسطر المتعددة يشرح فقرة كاملة أو يوقف عدة أسطر

  • /* يفتح التعليق و*/ يغلقه، وكل ما بين الرمزين تعليق مهما كان عدد الأسطر.
  • نستخدمه عندما يطول الشرح ولا يكفيه سطر واحد.
  • يفيد في إيقاف عدة أسطر من الكود دفعة واحدة.
  • إذا نسيت الإغلاق صار باقي الملف تعليقًا.
شرح طويل

فقرة لا يكفيها سطر واحد.

إيقاف عدة أسطر

نجرّب البرنامج بدونها دفعة واحدة.

رأس الملف

اسم البرنامج وكاتبه وتاريخه.

رأس ملف، وأسطر موقوفة

انقل الرمز */ إلى ما بعد السطر الذي يطبع Three. ماذا يتغير في الناتج؟

/* Program: Counting
   Author: Sara Ali
   Date: 2026-09-01 */
public class Counting {
    public static void main(String[] args) {
        System.out.println("One");
        /* System.out.println("Two"); */
        System.out.println("Three");
    }
}
الناتج
One
Three

تعليق أسطر متعددة في وسط السطر. ماذا يطبع البرنامج؟

public class Middle {
    public static void main(String[] args) {
        System.out.println("A"); /* System.out.println("B");
        System.out.println("C"); */ System.out.println("D");
    }
}
أظهر الناتج
الناتج
A
D

لماذا؟ يبدأ التعليق عند /* وينتهي عند */، بغض النظر عن الأسطر. فالطباعة الأولى قبله والأخيرة بعده.

تعليق التوثيق يصف البرنامج بوسوم تقرؤها أداة javadoc

السطرمعناه
/**يفتح تعليق التوثيق: شرطة ثم نجمتان
* Prints "Hello World!"وصف مختصر لما يفعله البرنامج
*سطر فارغ يفصل الوصف عن الوسوم
* @author Ahmed Aliاسم كاتب البرنامج
* @version 1.0رقم إصدار البرنامج
* @since 2020-09-25تاريخ أول إصدار للبرنامج
*/يغلق التعليق

أداة javadoc تقرأ هذه الأسطر وتنشئ منها صفحات توثيق، مثل صفحات توثيق Java الرسمية.

تعليق توثيق في برنامج حقيقي

شغّل البرنامج، ثم غيّر @author إلى اسمك و@version إلى 1.1. هل يتغير الناتج؟

/**
 * Prints "Hello World!"
 *
 * @author Ahmed Ali
 * @version 1.0
 * @since 2020-09-25
 */
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
الناتج
Hello World!

في NetBeans نكتب تعليق التوثيق وننشئ صفحاته بأمر واحد

  1. افتح الملف HelloWorld.javaمن شجرة المشروع في منطقة Projects.
  2. اكتب /** فوق الصنف ثم اضغط Enterيكمل NetBeans هيكل التعليق. أكمل الوصف والوسوم.
  3. اختر Run > Generate Javadocتظهر النتيجة في نافذة Output، وتُفتح الصفحات في المتصفح.
Output - HelloWorld (javadoc)
javadoc:
Generating Javadoc...
BUILD SUCCESSFUL (total time: 2 seconds)
ما تراه في نافذة Output عند نجاح الأمر.

ثلاثة أنواع من التعليقات، ولكل نوع استخدام

النوعمتى نستخدمهالصيغة
سطر واحدشرح قصير لسطر من الكود// comment
عدة أسطرشرح طويل، أو إيقاف عدة أسطر/* comment */
توثيقوصف البرنامج لأداة javadoc/** comment */

المترجم يتجاهل الأنواع الثلاثة. الفرق بينها في الشكل، وفي من يقرأ التعليق؛ فتعليق التوثيق وحده تقرؤه أداة javadoc لتصنع منه صفحات توثيق.

تريد أن يظهر وصف برنامجك في صفحات التوثيق. أي نوع تكتب؟

الرمز // داخل علامات التنصيص نص يُطبع، وليس تعليقًا

التعليق قبل الأمر. ماذا يطبع البرنامج قبل السطر Done؟

public class CommentFirst {
    public static void main(String[] args) {
        // System.out.println("Hi");
        System.out.println("Done");
    }
}
أظهر الناتج
الناتج
Done

لماذا؟ السطر كله تعليق، فلا يُنفَّذ أمر الطباعة ولا يظهر شيء منه.

الرمز داخل علامات التنصيص. ماذا يطبع البرنامج؟

public class InQuotes {
    public static void main(String[] args) {
        System.out.println("// Hi");
    }
}
أظهر الناتج
الناتج
// Hi

لماذا؟ النص بين علامتي التنصيص يُطبع حرفيًا، ومعه //. فالمترجم يتعرف على التعليق خارج علامات التنصيص فقط.

تعليق الأسطر المتعددة بلا إغلاق يحوّل باقي الملف إلى تعليق

تجربة مقصودة: حذفنا رمز الإغلاق

لاحظ أن NetBeans يضع علامة حمراء بجانب رقم السطر، وخطًا أحمر تحت موضع الخطأ، وأن الكود كله صار رماديًا. أضف رمز الإغلاق في نهاية التعليق.

public class Unclosed {
    public static void main(String[] args) {
        /* print a welcome message
        System.out.println("Welcome");
    }
}
رسالة المترجمunclosed comment
أظهر التصحيح
public class Unclosed {
    public static void main(String[] args) {
        /* print a welcome message */
        System.out.println("Welcome");
    }
}
الناتج
Welcome

لماذا؟ لا يوجد رمز إغلاق للتعليق، فيعتبر المترجم كل ما بعده تعليقًا حتى نهاية الملف. والكود الرمادي كله في NetBeans علامة على تعليق لم يُغلق.

لا تضع تعليق أسطر متعددة داخل تعليق آخر

أردنا إيقاف الأسطر الثلاثة كلها، لكن البرنامج لا يُترجم. احذف رمز الإغلاق الأول.

public class Nested {
    public static void main(String[] args) {
        /* outer comment
           /* inner comment */
           this line is outside the comment */
        System.out.println("Welcome");
    }
}
رسالة المترجمnot a statement
أظهر التصحيح
public class Nested {
    public static void main(String[] args) {
        /* outer comment
           /* inner comment
           this line is inside the comment */
        System.out.println("Welcome");
    }
}
الناتج
Welcome

لماذا؟ أول رمز */ ينهي التعليق كله، فيصبح ما بعده كودًا لا معنى له. ولهذا تبدو رسالة المترجم بعيدة عن السبب الحقيقي.

التعليق الجيد يشرح سبب الكود، ولا يكرر ما يقوله

اشرح السبب

اكتب لماذا وضعت السطر، لا ما يقوله الكود حرفيًا.

اختصر

سطر قصير واضح أفضل من فقرة طويلة.

حدّث التعليق

إذا غيّرت الكود فغيّر التعليق معه.

أي تعليق هو الأفضل؟

الجزء الثاني: رموز الهروب

رموز الهروب تبدأ بشرطة مائلة عكسية، وتطبع ما لا نكتبه مباشرة

كيف نطبع سطرًا جديدًا ومسافة جدولة وعلامة تنصيص داخل النص؟ بوضع رمز هروب داخل علامتي التنصيص.

الرمزمعناهداخل النصالناتج
\nسطر جديد"Ali\nSara"Ali ثم Sara في سطر جديد
\tمسافة جدولة"Ali\tSara"مسافة جدولة بين الاسمين
\\شرطة مائلة عكسية"C:\\Java"يطبع C:\Java
\"علامة تنصيص"\"Hi\""يطبع Hi بين علامتي تنصيص

جرّب الرموز الأربعة

توقّع الأسطر قبل التشغيل، ثم اضغط «تتبّع سطرًا سطرًا» وراقب أين يقف المؤشر بعد كل أمر.

public class Escapes {
    public static void main(String[] args) {
        System.out.println("Ali\nSara");
        System.out.println("Ali\tSara");
        System.out.println("C:\\Java");
        System.out.println("\"Hi\"");
    }
}
الناتج
Ali
Sara
Ali	Sara
C:\Java
"Hi"
  • رموز تحتاجها في هذه المحاضرة: حوّل لغة الكتابة إلى الإنجليزية قبل كتابة الكود (Alt+Shift).
  • الشرطة المائلة العكسية \: المفتاح فوق Enter، وبها تبدأ رموز الهروب.
  • الشرطة المائلة /: المفتاح المجاور لـ Shift الأيمن.
  • النجمة *: Shift مع الرقم 8.
  • علامة التنصيص ": Shift مع المفتاح المجاور لـ Enter.

الدالة print لا تنتقل إلى سطر جديد، و\" لا تغلق النص

print("Hi\n") تعمل مثل println("Hi")

print تطبع ولا تنتقل إلى سطر جديد. احذف \n من السطر الأول وتوقّع الناتج قبل التشغيل.

public class PrintNewLine {
    public static void main(String[] args) {
        System.out.print("Hi\n");
        System.out.print("Hello ");
        System.out.println("Java");
    }
}
الناتج
Hi
Hello Java

الخطأ: النص لم يُغلق

أردنا طباعة Hi فقط. احذف الشرطة المائلة العكسية الزائدة.

public class Quote {
    public static void main(String[] args) {
        System.out.println("Hi\");
    }
}
رسالة المترجمunclosed string literal
أظهر التصحيح
public class Quote {
    public static void main(String[] args) {
        System.out.println("Hi");
    }
}
الناتج
Hi

لماذا؟ \" تعني علامة تنصيص تُطبع، فلا تغلق النص. فيصل المترجم إلى نهاية السطر والنص ما زال مفتوحًا.

اطبع المسار والعنوان

اطبع السطرين كما في الناتج المتوقع، بأمر println واحد لكل سطر.

public class PathTitle {
    public static void main(String[] args) {
        // Print the two lines here

    }
}
الناتج المتوقع
C:\Users\Sara
The book "Java"
تلميح 1

كل شرطة عكسية تُطبع تحتاج إلى \\.

تلميح 2

كل علامة تنصيص تُطبع تحتاج إلى \".

الحل
public class PathTitle {
    public static void main(String[] args) {
        System.out.println("C:\\Users\\Sara");
        System.out.println("The book \"Java\"");
    }
}

تمرين ختامي: وثّق برنامجك واطبع بطاقة تعريف

  • تعليق توثيق فيه اسمك ورقم إصدار البرنامج.
  • تعليق سطر واحد فوق كل أمر طباعة، يشرح ما يطبعه.
  • رموز هروب: مسافة جدولة وعلامتا تنصيص.

بطاقة التعريف

اكتب البرنامج ليطبع البطاقة بالشكل المتوقع: مسافة جدولة واحدة بعد Name:. نجحت إذا ظهرت البطاقة كما في الناتج، ولم يظهر أي تعليق فيه.

/**
 * Prints a student ID card.
 *
 * @author Your Name
 * @version 1.0
 */
public class Comments {
    public static void main(String[] args) {
        // Write one comment and one print statement for each line

    }
}
الناتج المتوقع
Name:	Ahmed
Course: "Programming 1"
Version: 1.0
تلميح 1

استخدم \t بعد Name: و\" حول اسم المساق.

تلميح 2

جرّب طباعة البطاقة كلها بأمر println واحد مستخدمًا \n، ثم جرّب طباعتها بثلاثة أوامر.

الحل
/**
 * Prints a student ID card.
 *
 * @author Ahmed Ali
 * @version 1.0
 */
public class Comments {
    public static void main(String[] args) {
        // the student's name, after a tab
        System.out.println("Name:\tAhmed");
        // the course name, in quotation marks
        System.out.println("Course: \"Programming 1\"");
        // the program version
        System.out.println("Version: 1.0");
    }
}

أسئلة المراجعة

ماذا يفعل المترجم بالتعليقات؟

متى تستخدم تعليق الأسطر المتعددة بدل تعليق السطر الواحد؟

لماذا صار الكود كله رماديًا بعد كتابة هذا السطر؟

/* start of program

ماذا يطبع كل سطر؟

public class Review {
    public static void main(String[] args) {
        System.out.println("A\tB");
        System.out.println("// A");
    }
}
أظهر الناتج
الناتج
A	B
// A

لماذا؟ \t داخل النص يطبع مسافة جدولة، و// داخل النص نص عادي وليس تعليقًا.