دستگرمی دوم

دستگرمی این هفته:
خروجی کد جاوای زیر چیست؟
interface A {
int MAX = 5;
default int f() {
return MAX + 2;
}
public static void main(String[] args) {
Object[] objs = {"", new D(), null};
int result = 0;
for (Object obj : objs) {
try {
A test = obj instanceof B ? (B) obj : (A) obj;
result += test.f();
} catch (ClassCastException e) {
result++;
} catch (NullPointerException e) {
result--;
}
}
System.out.println(result);
}
}
interface B extends A {
@Override
int f();
}
class D implements B {
@Override
public int f() {
return MAX << 1;
}
}
پاسخ:
خروجی این کد برابر است با: 10
برای رسیدن به پاسخ صحیح، متد main را خط به خط بررسی میکنیم:
خط ۷: سه شی مختلف ایجاد شده و در آرایهای از نوع Object ریخته میشوند. میدانید که در جاوا، کلاس Object پدر تمام کلاسها است.
خط ۸: متغیر result با مقدار اولیه 0 ایجاد شده.
خط ۹: به ازای هر یک از اشیای موجود در آرایه objs، بدنه این حلقه اجرا میشود و مهم است بفهمیم که در هر بار اجرا، مقدار متغیر result چه تغییری میکند.
• اجرای اول:
obj = “”
در خط 11، رشته خالی نمونهای از B نبوده و قابل Cast شدن به A هم نیست. بنابراین، ClassCastException پرتاب شده و خط 14 اجرا میشود. به این ترتیب، result = 1 خواهد بود.
• اجرای دوم:
obj = new D()
در خط 11، obj نمونهای از D است و در نتیجه از نوع B نیز هست؛ بنابراین Cast میشود به B.
ولی بههرحال obj از نوع D است و در خط 12، متد f از کلاس D اجرا میشود. در نتیجه مقدار result برابر با 11 خواهد شد.
• اجرای سوم:
obj = null
در اثر اجرای خط 11، مقدار test هم برابر null میشود. پس در خط 12 استثنای NullPointerException پرتاب میشود و مقدار result یک واحد کم شده برابر با 10 میشود.
خط 19: مقدار 10 در خروجی چاپ میشود.
.
.
.
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers



