مستوى الصعوبة : متوسط
توقع مخرجات برامج Java التالية:
البرنامج 1:
Javaclass Gfg { // constructor Gfg() { System.out.println('Geeksforgeeks'); } static Gfg a = new Gfg(); //line 8 public static void main(String args[]) { Gfg b; //line 12 b = new Gfg(); } }
الإخراج:
Geeksforgeeks
Geeksforgeeks
توضيح:
نحن نعلم أنه يتم استدعاء المتغيرات الثابتة عند تحميل الفصل ويتم استدعاء المتغيرات الثابتة مرة واحدة فقط. الآن ينتج عن السطر 13 إنشاء كائن والذي بدوره يستدعي المنشئ وتتم طباعة "Geeksforgeeks" للمرة الثانية. إذا لم يتم استخدام المتغير الثابت في السطر 8، فسيتم استدعاء الكائن بشكل متكرر بلا حدود مما يؤدي إلى خطأ StackOverFlow.
slf4j مقابل log4j
البرنامج 2:
Javaclass Gfg { static int num; static String mystr; // constructor Gfg() { num = 100; mystr = 'Constructor'; } // First Static block static { System.out.println('Static Block 1'); num = 68; mystr = 'Block1'; } // Second static block static { System.out.println('Static Block 2'); num = 98; mystr = 'Block2'; } public static void main(String args[]) { Gfg a = new Gfg(); System.out.println('Value of num = ' + a.num); System.out.println('Value of mystr = ' + a.mystr); } }
الإخراج:
Static Block 1
Static Block 2
Value of num = 100
Value of mystr = Constructor
توضيح:
يتم تنفيذ الكتلة الثابتة عند تحميل الفصل في الذاكرة. يمكن أن يحتوي الفصل على كتل ثابتة متعددة يتم تنفيذها بنفس التسلسل الذي تمت كتابته به في البرنامج.
ملحوظة : يمكن للطرق الثابتة الوصول إلى متغيرات الفئة دون استخدام كائن الفئة. نظرًا لأنه يتم استدعاء المُنشئ عند إنشاء مثيل جديد، يتم أولاً استدعاء الكتل الثابتة وبعد ذلك يتم استدعاء المُنشئ. إذا كنا قد قمنا بتشغيل نفس البرنامج دون استخدام الكائن، فلن يتم استدعاء المُنشئ.
البرنامج 3:
Javaclass superClass { final public int calc(int a int b) { return 0; } } class subClass extends superClass { public int calc(int a int b) { return 1; } } public class Gfg { public static void main(String args[]) { subClass get = new subClass(); System.out.println('x = ' + get.calc(0 1)); } }
الإخراج:
Compilation fails. توضيح:
تعتبر طريقة calc() في الفئة superClass نهائية وبالتالي لا يمكن تجاوزها.
البرنامج 4:
Javapublic class Gfg { public static void main(String[] args) { Integer a = 128 b = 128; System.out.println(a == b); Integer c = 100 d = 100; System.out.println(c == d); } }
الإخراج:
false
true
توضيح:
تعليق متعدد الأسطر بوويرشيل
في الكود المصدري لكائن Integer سنجد طريقة "valueOf" التي يمكننا من خلالها رؤية أن نطاق كائن Integer يقع من IntegerCache.low(-128) إلى IntegerCache.high(127). ولذلك فإن الأرقام فوق 127 لن تعطي الناتج المتوقع. يمكن ملاحظة نطاق IntegerCache من الكود المصدري لفئة IntegerCache.