دستگرمی

دستگرمی دوم

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

خروجی کد جاوای زیر چیست؟

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

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

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

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

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