التعليقات في جافا
ملاحظات نكتبها للبشر داخل الكود، ويتجاهلها المترجم
إعداد: م. بدر الدين محمد الحليمي · م. محمد زهير كحيل
في نهاية هذه المحاضرة ستكون قادرًا على
- تشرح وظيفة التعليق ولماذا يتجاهله المترجم
- تكتب تعليق سطر واحد وتعليق عدة أسطر
- تكتب تعليق توثيق بوسوم الكاتب والإصدار والتاريخ
- تكتشف خطأ تعليق غير مغلق وتصححه
- تطبع نصوصًا منسقة باستخدام رموز الهروب
محتويات المحاضرة
- التعليق يجعل الكود مفهومًا لمن يقرؤه بعدك
- التعليق ملاحظة داخل الكود يتجاهلها المترجم
- التعليق يشرح الكود، ويذكّرك بفكرتك، ويوقف سطرًا مؤقتًا
- التعليقات تبقى في الكود عالي المستوى، ولا تصل إلى لغة الآلة
- تعليق السطر الواحد يبدأ بـ // ويتوقف عند نهاية السطر
- تعليق الأسطر المتعددة يشرح فقرة كاملة أو يوقف عدة أسطر
- تعليق التوثيق يصف البرنامج بوسوم تقرؤها أداة javadoc
- في NetBeans نكتب تعليق التوثيق وننشئ صفحاته بأمر واحد
- ثلاثة أنواع من التعليقات، ولكل نوع استخدام
- الرمز // داخل علامات التنصيص نص يُطبع، وليس تعليقًا
- تعليق الأسطر المتعددة بلا إغلاق يحوّل باقي الملف إلى تعليق
- التعليق الجيد يشرح سبب الكود، ولا يكرر ما يقوله
- رموز الهروب تبدأ بشرطة مائلة عكسية، وتطبع ما لا نكتبه مباشرة
- الدالة
printلا تنتقل إلى سطر جديد، و\"لا تغلق النص - تمرين ختامي: وثّق برنامجك واطبع بطاقة تعريف
- أسئلة المراجعة
التعليق يجعل الكود مفهومًا لمن يقرؤه بعدك
كود بلا تعليقات
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 من ملف فيه تعليقات؟
تعليق السطر الواحد يبدأ بـ // ويتوقف عند نهاية السطر
- اكتب الكود وشغّلهفي المختبر اضغط F6، وهنا زر «تشغيل» أو Ctrl+Enter.
- توقّع: هل يظهر التعليق في الناتج؟
- احذف
//من السطر الثالث وشغّل - فسّر رسالة الخطأ، ثم أعد
//
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 نكتب تعليق التوثيق وننشئ صفحاته بأمر واحد
- افتح الملف
HelloWorld.javaمن شجرة المشروع في منطقة Projects. - اكتب
/**فوق الصنف ثم اضغط Enterيكمل NetBeans هيكل التعليق. أكمل الوصف والوسوم. - اختر Run > Generate Javadocتظهر النتيجة في نافذة Output، وتُفتح الصفحات في المتصفح.
Output - HelloWorld (javadoc)
javadoc:
Generating Javadoc...
BUILD SUCCESSFUL (total time: 2 seconds)ثلاثة أنواع من التعليقات، ولكل نوع استخدام
| النوع | متى نستخدمه | الصيغة |
|---|---|---|
| سطر واحد | شرح قصير لسطر من الكود | // comment |
| عدة أسطر | شرح طويل، أو إيقاف عدة أسطر | /* comment */ |
| توثيق | وصف البرنامج لأداة javadoc | /** comment */ |
المترجم يتجاهل الأنواع الثلاثة. الفرق بينها في الشكل، وفي من يقرأ التعليق؛ فتعليق التوثيق وحده تقرؤه أداة javadoc لتصنع منه صفحات توثيق.
تريد أن يظهر وصف برنامجك في صفحات التوثيق. أي نوع تكتب؟
/* هي ما يميّز تعليق التوثيق، و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 داخل النص يطبع مسافة جدولة، و// داخل النص نص عادي وليس تعليقًا.