دستگرمی دهم
دستگرمی این هفته
برنامه زیر را در نظر بگیرید:
class Initialization1 { public Initialization1() { print(1); } private int a1 = print(2); private static int a2 = print(3); { print(4); } static { print(5); } private int b1 = print(6); private static int b2 = print(7); { print(8); } static { print(9); } private static int print(int number) { System.out.print(number); return 0; } } public class Initialization2 extends Initialization1 { public Initialization2() { print(1); } private int a1 = print(2); private static int a2 = print(3); { print(4); } static { print(5); } private int b1 = print(6); private static int b2 = print(7); { print(8); } static { print(9); } private static int print(int number) { System.out.print(number); return 0; } public static void main(String[] args) { Initialization2 x = new Initialization2(); } }
خروجی برنامه فوق کدام گزینه است؟
- 123456789123456789 (60%, 3 رای)
- 375937592648126481 (40%, 2 رای)
- 357935792468124681 (0%, 0 رای)
- 357924681 (0%, 0 رای)
- 375926481 (0%, 0 رای)
مجموع رای ها: 5
پاسخ
پاسخ صحیح: 357935792468124681
همانطور که در دستگرمی چهارم هم توضیح داده شد، ترتیب مقداردهی اولیه به این صورت است:
یک بار برای هر کلاس (اول برای کلاس پدر و سپس برای کلاس فرزند):
- مقدارهی درخط به متغیرهای استاتیک و بلوکهای استاتیک (static block) – به ترتیبی که در کد نوشته شدهاند.
بک بار به ازای ایجاد هر شی (اول برای کلاس پدر و سپس برای کلاس فرزند):
- مقداردهی درخط به متغیرها و بلوکهای مقداردهی اولیه (instance initialization block) – به ترتیبی که در کد نوشته شدهاند و سپس فراخوانی سازنده (Constructor)
با این توضیحات، سراغ متد main میرویم:
در خط 52، یک شی از کلاس Initialization2 میخواهد ایجاد شود.
برای این منظور ابتدا به سراغ کلاس پدرش یعنی کلاس Initialization1 میرویم. ابتدا متغیرها و بلوکهای استاتیک کلاس پدر مقداردهی میشوند. با مقداردهی متغیرها و بلوکهای استاتیک در کلاس Initialization1، به ترتیب اعداد 3579 در خروجی چاپ میشود.
سپس متغیرها و بلوکهای استاتیک کلاس فرزند یعنی Initialization2 مقداردهی میشوند و در نتیجه باز هم به ترتیب اعداد 3579 در خروجی چاپ میشوند.
حال، دوباره به سراغ کلاس پدر رفته و ابتدا متغیرها و بلوکهای غیراستاتیک مقداردهی شده و سپس سازنده این کلاس فراخوانی میشود. در نتیجه مقدار 24681 در خروجی چاپ میشود. پس از کلاس پدر، مجددا به سراغ کلاس فرزند میرویم و متغیرها و بلوکهای غیراستاتیک کلاس فرزند را به ترتیب مقداردهی کرده و در نهایت نیز سازنده این کلاس فراخوانی میشود. پس مقدار 24681 نیز در ادامه خروجی چاپ خواهد شد.
با مقداردهی متغیرها و بلوکهای غیراستاتیک، به ترتیب اعداد 2468 در خروجی چاپ میشود.
خروجی نهایی در کنسول، عبارت است از 357935792468124681
.
.
.
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers