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

دستگرمی این هفته:
فرض کنید کلیهی متدهایی که در کلاسهای 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

پاسخ:
پاسخ صحیح: 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
جای ۳ با ۴ و ۹ با ه باید عوض شود. یعنی
۱۲۶۷۴۳۵۹۸۱۰ ۴۳۵۹۸۱۰
چون ابتدا مقدار دهی در خط و سپس بلوک مقدار دهی اجرا میشود، بنا به اسلاید
سلام
ممنون از دقت و تذکر شما
پاسخ دستگرمی درست است اما در توضیحاتی که به آن ارجاع داده بودیم، به یک نکته ظریف اشاره نشده بود و آنهم اینکه اجرای مقداردهی درخط، اولویتی به اجرای بلوک مقداردهی ندارد و به همان ترتیبی که نوشته شدهاند، اجرا میشوند.
در توضیحات این سوال، این نکته رو اضافه کردیم و انشاالله برای توضیحات موجود در اسلایدها هم اصلاحیهای منتشر خواهیم کرد.
با تشکر