دستگرمی دهم

دستگرمی این هفته
برنامه زیر را در نظر بگیرید:
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



