دستگرمی

دستگرمی چهارم

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

فرض کنید کلیه‎ی متدهایی که در کلاس‎های Parent و Child صدا شده‎اند، در کلاس Utility تعریف شده‎اند و در داخل هر یک ازاین متدها، شماره اسم آن متد در خروجی چاپ می‎شود. مثلا در داخل متد ()f عدد 6 در خروجی چاپ میشود )زیرا f 6امین حرف ازحروف الفبا است).
با این توضیحات، خروجی برنامه زیر کدام گزینه خواهد بود؟

public class Parent extends Utility {
	static int a = a();
	static { a = b();}
	{ b = c();}
	int b = d();
	public Parent() {
	        b = e();
	}
	
    public static void main(String[] args) {
    	Child c1 = new Child();
    	System.out.print(" ");
    	Child c2 = new Child();
    }
}
class Child extends Parent {
	static int c = f();
	static { c = g(); }
	{ b = h(); }
	int b = i();
	public Child() {
		b = j();
	}
}

خروجی برنامه فوق کدام گزینه است؟

  • 3458910 12673458910 (50%, 2 رای)
  • 12673458910 12673458910 (25%, 1 رای)
  • 6798510 67129843510 (25%, 1 رای)
  • 4398105 21764398510 (0%, 0 رای)
  • 4359810 43598102176 (0%, 0 رای)
  • 3849510 38495101627 (0%, 0 رای)

مجموع رای ها: 4

Loading ... Loading ...

پاسخ:

پاسخ صحیح:  3458910 12673458910

ترتیب مقداردهی اولیه به این صورت است:

یک بار برای هر کلاس (اول برای کلاس پدر و سپس برای کلاس فرزند):

  • مقدارهی درخط به متغیرهای استاتیک و بلوک‌های استاتیک (static block) – به ترتیبی که در کد نوشته شده‎اند.

بک بار به ازای ایجاد هر شی (اول برای کلاس پدر و سپس برای کلاس فرزند):

  • مقداردهی درخط به متغیرها و بلوک‎های مقداردهی اولیه (instance initialization block) – به ترتیبی که در کد نوشته شده‎اند.
  • سازنده (Constructor)

با این توضیحات، سراغ متد main می‎رویم:

در خط اول main، شی c1  که اولین شی از Child است، ایجاد می‌شود. به این ترتیب،

1- یک بار برای کلاس Parent دو خط زیر اجرا می‌شود:

static int a = a();
static { a = b();}

و در خروجی مقدار 12 نوشته می‎شود.

2- یک بار هم برای کلاس Child دو خط زیر اجرا می‎شود:

static int c = f();
static { c = g(); }

و در خروجی مقدار 67 نوشته می‎شود.

3- سپس سراغ ویژگی‎ها و بلاک‎های غیراستاتیک و سازنده می‎رویم.

ابتدا برای کلاس Parent، خطوط زیر اجرا می‎شوند:

{ b = c();}
int b = d();
public Parent() {
  b = e();
}

و در خروجی مقدار 345 نوشته می‎شود.

4- سپس برای کلاس Child، خطوط زیر اجرا می‎شوند:

{ b = h(); }
int b = i();
public Child() {
  b = j();
}

و در خروجی مقدار 8910 نوشته می‎شود.

پس تا اینجا برای ایجاد شی c1 مقدار 12673458910 در خروجی نوشته شد.

در خط دوم main، یک کاراکتر فاصله چاپ می‎شود.

در خط سوم main، شی جدید c2 ایجاد می‎شود. در اینجا باید توجه داشته باشیم که چون c2 اولین شی ساخته‎شده از Child نیست، دیگر قسمت مربوط به مقداردهی ویژگی‎ها و بلاک‎های استاتیک اجرا نمی‎شود و فقط بخش‎های مربوط به توضیحات 3 و 4 دوباره اجرا می‎شوند. به این ترتیب، مقدار 3458910 در ادامه خروجی نوشته می‎شود.

در انتها، در خروجی خواهیم داشت:

12673458910 3458910

.

.

.

با ما همراه باشید

آدرس کانال تلگرام: JavaCupIR@

آدرس اکانت توییتر: JavaCupIR@

آدرس صفحه اینستاگرام: javacup.ir

آدرس گروه لینکدین: Iranian Java Developers

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

‫2 دیدگاه ها

  1. جای ۳ با ۴ و ۹ با ه‍ باید عوض شود. یعنی
    ۱۲۶۷۴۳۵۹۸۱۰ ۴۳۵۹۸۱۰
    چون ابتدا مقدار دهی در خط و سپس بلوک مقدار دهی اجرا میشود، بنا به اسلاید

    1. سلام
      ممنون از دقت و تذکر شما
      پاسخ دستگرمی درست است اما در توضیحاتی که به آن ارجاع داده بودیم، به یک نکته ظریف اشاره نشده بود و آن‎هم اینکه اجرای مقداردهی درخط، اولویتی به اجرای بلوک مقداردهی ندارد و به همان ترتیبی که نوشته شده‎اند، اجرا می‎شوند.

      در توضیحات این سوال، این نکته رو اضافه کردیم و انشاالله برای توضیحات موجود در اسلایدها هم اصلاحیه‎ای منتشر خواهیم کرد.

      با تشکر

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

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

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