دستگرمی دوم

دستگرمی این هفته:
خروجی کد جاوای زیر چیست؟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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; } } |
پاسخ:
خروجی این کد برابر است با: ۱۰
برای رسیدن به پاسخ صحیح، متد main را خط به خط بررسی میکنیم:
خط ۷: سه شی مختلف ایجاد شده و در آرایهای از نوع Object ریخته میشوند. میدانید که در جاوا، کلاس Object پدر تمام کلاسها است.
خط ۸: متغیر result با مقدار اولیه ۰ ایجاد شده.
خط ۹: به ازای هر یک از اشیای موجود در آرایه objs، بدنه این حلقه اجرا میشود و مهم است بفهمیم که در هر بار اجرا، مقدار متغیر result چه تغییری میکند.
• اجرای اول:
obj = “”
در خط ۱۱، رشته خالی نمونهای از B نبوده و قابل Cast شدن به A هم نیست. بنابراین، ClassCastException پرتاب شده و خط ۱۴ اجرا میشود. به این ترتیب، result = 1 خواهد بود.
• اجرای دوم:
obj = new D()
در خط ۱۱، obj نمونهای از D است و در نتیجه از نوع B نیز هست؛ بنابراین Cast میشود به B.
ولی بههرحال obj از نوع D است و در خط ۱۲، متد f از کلاس D اجرا میشود. در نتیجه مقدار result برابر با ۱۱ خواهد شد.
• اجرای سوم:
obj = null
در اثر اجرای خط ۱۱، مقدار test هم برابر null میشود. پس در خط ۱۲ استثنای NullPointerException پرتاب میشود و مقدار result یک واحد کم شده برابر با ۱۰ میشود.
خط ۱۹: مقدار ۱۰ در خروجی چاپ میشود.
.
.
.
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers