دستگرمی دوم

دستگرمی این هفته:
خروجی کد جاوای زیر چیست؟
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