دستگرمی دهم

دستگرمی این هفته
برنامه زیر را در نظر بگیرید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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

پاسخ
پاسخ صحیح: ۳۵۷۹۳۵۷۹۲۴۶۸۱۲۴۶۸۱
همانطور که در دستگرمی چهارم هم توضیح داده شد، ترتیب مقداردهی اولیه به این صورت است:
یک بار برای هر کلاس (اول برای کلاس پدر و سپس برای کلاس فرزند):
- مقدارهی درخط به متغیرهای استاتیک و بلوکهای استاتیک (static block) – به ترتیبی که در کد نوشته شدهاند.
بک بار به ازای ایجاد هر شی (اول برای کلاس پدر و سپس برای کلاس فرزند):
- مقداردهی درخط به متغیرها و بلوکهای مقداردهی اولیه (instance initialization block) – به ترتیبی که در کد نوشته شدهاند و سپس فراخوانی سازنده (Constructor)
با این توضیحات، سراغ متد main میرویم:
در خط ۵۲، یک شی از کلاس Initialization2 میخواهد ایجاد شود.
برای این منظور ابتدا به سراغ کلاس پدرش یعنی کلاس Initialization1 میرویم. ابتدا متغیرها و بلوکهای استاتیک کلاس پدر مقداردهی میشوند. با مقداردهی متغیرها و بلوکهای استاتیک در کلاس Initialization1، به ترتیب اعداد ۳۵۷۹ در خروجی چاپ میشود.
سپس متغیرها و بلوکهای استاتیک کلاس فرزند یعنی Initialization2 مقداردهی میشوند و در نتیجه باز هم به ترتیب اعداد ۳۵۷۹ در خروجی چاپ میشوند.
حال، دوباره به سراغ کلاس پدر رفته و ابتدا متغیرها و بلوکهای غیراستاتیک مقداردهی شده و سپس سازنده این کلاس فراخوانی میشود. در نتیجه مقدار ۲۴۶۸۱ در خروجی چاپ میشود. پس از کلاس پدر، مجددا به سراغ کلاس فرزند میرویم و متغیرها و بلوکهای غیراستاتیک کلاس فرزند را به ترتیب مقداردهی کرده و در نهایت نیز سازنده این کلاس فراخوانی میشود. پس مقدار ۲۴۶۸۱ نیز در ادامه خروجی چاپ خواهد شد.
با مقداردهی متغیرها و بلوکهای غیراستاتیک، به ترتیب اعداد ۲۴۶۸ در خروجی چاپ میشود.
خروجی نهایی در کنسول، عبارت است از ۳۵۷۹۳۵۷۹۲۴۶۸۱۲۴۶۸۱
.
.
.
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers