دستگرمی

دستگرمی دهم

دستگرمی این هفته

برنامه زیر را در نظر بگیرید:

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

Loading ... Loading ...

پاسخ

پاسخ صحیح: 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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا