
- من از سوالاتی که با این سری مقالات همپوشانی دارند صرف نظر می کنم تا اطلاعات تکراری بی مورد انجام نشود. خواندن این مقالات را توصیه می کنم زیرا رایج ترین (محبوب ترین) سوالات مصاحبه Java Core را پوشش می دهند.
- میتوانم پاسخها را با جزئیات بیشتری توضیح دهم، اما نمیکنم، زیرا در این صورت هر پاسخ میتواند برای کل مقاله طول بکشد. و هیچ کس در هر مصاحبه شغلی از شما این سطح از جزئیات را نمی خواهد.
11. همه متدهای کلاس Object را نام ببرید
کلاس Object 11 متد دارد:-
Class<?> getClass() - کلاس شی فعلی را دریافت کنید.
-
int hashCode() - کد هش شی فعلی را دریافت کنید.
-
بولی برابر است (Object obj) - شی فعلی را با یک شی دیگر مقایسه کنید.
-
Object clone() - یک کپی از شی فعلی ایجاد و برگرداند.
-
String toString() - نمایش رشته شی را دریافت کنید.
-
void notify() - یک رشته در حال انتظار در مانیتور این شیء را بیدار کنید (انتخاب رشته تصادفی است).
-
void notifyAll() - تمام رشته های منتظر در مانیتور این شی را بیدار می کند.
-
void wait() - بگذارید رشته فعلی روی مانیتور فعلی منتظر بماند (رشته فعلی را مسدود کنید) تا زمانی که یک تماس notify یا NotifyAll رشته را بیدار کند (فقط در یک بلوک همگامسازی شده کار میکند).
-
انتظار خالی (مدت زمان طولانی) - موضوع فعلی را روی مانیتور فعلی (در بلوک همگام سازی شده فعلی)، اما با یک مهلت زمانی برای خروج از حالت انتظار (یا دوباره، تا زمانی که یک تماس Notify یا NotifyAll رشته را بیدار کند) منتظر بمانید.
-
انتظار خالی (تایم اوت طولانی، نانوهای داخلی) - این روش مانند روش قبلی است، اما با تایم اوت دقیق تر.
-
void finalize() - این متد (در نهایت) قبل از حذف شی توسط زباله گرد فراخوانی می شود. برای پاکسازی منابع به دست آمده استفاده می شود.
12. تفاوت try-with-resources و try-catch-finally هنگام کار با منابع چیست؟
به طور معمول، هنگام استفاده از try-catch-finally ، بلوک نهایی برای بستن منابع استفاده می شود. جاوا 7 بیانیه جدید try-with-resources را معرفی می کند . مشابه این است که در نهایت برای آزاد کردن منابع تلاش کنید، اما فشرده تر و خواناتر است. بیایید به یاد بیاوریم که try-catch-در نهایت چگونه به نظر می رسد:
String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
حالا بیایید این کد را بازنویسی کنیم، اما با استفاده از try-with-resources :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
حالا این تا حدودی ساده تر است، فکر نمی کنید؟ علاوه بر کد ساده تر، چند نکته دیگر نیز وجود دارد:
-
در try-with-resources ، منابع اعلام شده در داخل پرانتز (منابعی که بسته خواهند شد) باید رابط AutoCloseable و متد () تنها آن را پیاده سازی کنند .
روش بستن در یک بلوک نهایی ضمنی اجرا میشود ، در غیر این صورت، چگونه برنامه دقیقاً چگونه میتواند منبع را ببندد؟
اما احتمالاً به ندرت پیاده سازی منابع و روش بسته شدن آنها را خواهید نوشت.
-
بلوک ها به ترتیب زیر اجرا می شوند:
- بلوک سعی کنید .
- ضمنی در نهایت بلوک.
- بلوک catch که استثناهایی را که در مراحل قبلی رخ میدهند را میگیرد.
- صریح در نهایت بلوک.
به عنوان یک قاعده، استثناهایی که در لیست پایینتر قرار میگیرند، مواردی که در بالاتر پرتاب میشوند را قطع میکنند.
13. عملیات بیتی چیست؟
عملیات بیتی عملیات روی دنباله ای از بیت ها هستند. آنها شامل عملیات منطقی و شیفت های بیتی هستند. عملگرهای منطقی:-
bitwise AND - مقادیر بیت را مقایسه می کند. هر بیتی که روی 0 تنظیم شود (نادرست) بیت مربوطه را در نتیجه 0 قرار می دهد. یعنی اگر بیتی در هر دو مقدار مقایسه شده 1 (درست) باشد، بیت حاصل نیز 1 خواهد بود.
مشخص شده با AND یا &
مثال: 10111101 و 01100111 = 00100101
-
bitwise OR - این عملیات برعکس عملیات قبلی است. هر بیتی که روی 1 تنظیم شود، بیت مربوطه را در نتیجه 1 قرار می دهد. بر این اساس، اگر بیت در هر دو مقدار مقایسه شده 0 باشد، بیت حاصل نیز 0 خواهد بود.
با OR یا | مشخص می شود
مثال: 10100101 | 01100011 = 11100111
-
bitwise NOT - این عملگر به یک مقدار اعمال می شود. بیت ها را ورق می زند (معکوس می کند). یعنی بیت هایی که 1 بودند تبدیل به 0 می شوند. و آنهایی که 0 بودند 1 می شوند.
با NOT یا ~ مشخص می شود
مثال: ~10100101 = 01011010
-
OR انحصاری bitwise - مقادیر بیت را مقایسه می کند. اگر هر دو بیت 1 باشند، بیت حاصل 0 است. اگر هر دو بیت 0 باشند، بیت حاصل 0 است. به عبارت دیگر، برای اینکه بیت حاصل 1 باشد، فقط یکی از بیت ها باید 1 باشد و بیت دیگر باید 0 باشد.
با XOR یا ^ مشخص می شود
مثال: 10100101 ^ 01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000


14. چه اشیا استاندارد تغییرناپذیری در جاوا وجود دارد؟
اگر یک شیء اجازه تغییر مقادیر اصلی خود را ندهد تغییر ناپذیر است. ممکن است متدهایی داشته باشد که اشیاء جدیدی از همان نوع را با مقادیر متفاوت برمی گرداند. برخی از اشیاء تغییرناپذیر استاندارد عبارتند از:- بدون شک، معروف ترین نوع تغییرناپذیر جاوا String است.
- نمونههایی از کلاسهای wrapper که انواع استاندارد را پوشش میدهند: Boolean، Character، Byte، Short، Integer، Long، Double، Float.
- اشیاء BigInteger و BigDecimal که معمولاً برای اعداد BIG استفاده می شوند.
- اشیاء StackTraceElement که یک stack trace را می سازند (به عنوان مثال، stack trace یک استثنا).
- یک شی از کلاس File - می تواند فایل ها را تغییر دهد، اما در عین حال خود شی بدون تغییر باقی می ماند.
- UUID که اغلب برای شناسایی منحصر به فرد عناصر استفاده می شود.
- تمام اشیاء کلاس ها در بسته java.time.
- اشیاء محلی، که برای شناسایی یک منطقه جغرافیایی، سیاسی یا فرهنگی استفاده می شود.
15-مزایای جسم تغییرناپذیر نسبت به اجسام معمولی چیست؟
-
اشیای تغییرناپذیر برای استفاده در محیط چند رشته ای ایمن هستند . آنها این کار را انجام می دهند تا دیگر نگران از دست دادن اطلاعات به دلیل شرایط مسابقه نباشید. این با زمانی که شما با اشیاء معمولی کار می کنید متفاوت است. در این صورت، هنگام استفاده از شیء در یک محیط موازی، باید فکر کنید و مکانیسم های خوبی ارائه دهید.
-
اشیاء تغییرناپذیر به عنوان کلید در نقشه خوب هستند. اگر از یک شیء قابل تغییر به عنوان کلید HashMap استفاده کنید و سپس وضعیت شی تغییر کند، ساختار داده ممکن است گیج شود: شی همچنان وجود خواهد داشت، اما اگر از containKey() استفاده کنید، ممکن است آن را پیدا نکنید.
-
اشیای تغییرناپذیر برای ذخیره داده های تغییرناپذیر (ثابت) عالی هستند که هرگز نباید در حین اجرای برنامه تغییر داده شوند.
-
مزیت دیگر اتمی بودن شکست است. اگر یک شیء تغییرناپذیر یک استثنا پرتاب کند، در حالت ناخواسته (شکسته) باقی نمی ماند.
-
این کلاس ها به راحتی قابل تست هستند.
-
شما به هیچ مکانیزم اضافی مانند سازنده کپی یا اجرای شبیه سازی شی نیاز ندارید.
سوالات در مورد OOP
16. مزایای OOP به طور کلی و در مقایسه با برنامه نویسی رویه ای چیست؟
خوب، مزایای OOP:-
نوشتن برنامه های پیچیده با استفاده از OOP آسان تر از برنامه نویسی رویه ای است زیرا همه چیز به ماژول های کوچک تقسیم می شود - اشیایی که با یکدیگر تعامل دارند - و در نتیجه، برنامه نویسی به روابط بین اشیا کاهش می یابد.
-
برنامه های نوشته شده با OOP بسیار ساده تر تغییر می کنند (زمانی که اصول طراحی به درستی رعایت شود).
-
از آنجایی که هم داده ها و هم عملیات داده یک موجودیت واحد را تشکیل می دهند، آنها در سراسر برنامه لکه دار نمی شوند (که اغلب در برنامه نویسی رویه ای چنین است).
-
اصل کپسوله سازی از حیاتی ترین داده ها از کاربر محافظت می کند.
-
همان کد را میتوان با دادههای مختلف دوباره استفاده کرد، زیرا کلاسها به شما اجازه میدهند تا اشیاء زیادی ایجاد کنید که هر کدام مقادیر خاص خود را دارند.
-
وراثت و چندشکلی همچنین به شما امکان می دهد از کدهای موجود استفاده مجدد و گسترش دهید (به جای تکرار عملکردهای مشابه).
-
گسترش یک برنامه کاربردی ساده تر از رویکرد رویه ای است.
-
رویکرد OOP امکان انتزاع کردن جزئیات پیاده سازی را فراهم می کند.
17. به ما بگویید OOP چه معایبی دارد
متأسفانه آنها نیز وجود دارند:-
OOP به دانش نظری زیادی نیاز دارد که قبل از نوشتن هر چیزی باید تسلط داشته باشید.
-
درک و کاربرد ایده های OOP چندان آسان نیست (شما باید در قلب کمی فیلسوف باشید).
-
OOP به دلیل افزایش پیچیدگی سیستم، عملکرد یک برنامه را اندکی کاهش می دهد.
-
رویکرد OOP به حافظه بیشتری نیاز دارد زیرا همه چیز از کلاس ها، رابط ها، متدها تشکیل شده است که حافظه بسیار بیشتری نسبت به متغیرهای معمولی اشغال می کنند.
-
زمان مورد نیاز برای تحلیل اولیه بیشتر از یک رویکرد رویه ای است.
18. چندشکلی ایستا در مقابل چندشکلی پویا چیست؟
چند شکلی به اشیاء یک کلاس یا رابط اجازه می دهد تا رفتار متفاوتی داشته باشند. دو نوع پلی مورفیسم وجود دارد که به آنها پیوند زودرس و دیررس نیز میگویند. پلی مورفیسم ایستا یا اتصال اولیه:- در زمان کامپایل (در اوایل چرخه عمر برنامه) رخ می دهد.
- تصمیم می گیرد که کدام متد را در زمان کامپایل اجرا کند.
- روش اضافه بار نمونه ای از چند شکلی استاتیک است.
- اتصال اولیه شامل روش های خصوصی، ایستا و نهایی است.
- وراثت در اتصال اولیه دخیل نیست.
- چند شکلی ایستا شامل اشیاء خاصی نمی شود، بلکه اطلاعاتی در مورد نوع کلاسی که در سمت چپ نام متغیر ظاهر می شود را شامل می شود.
- در زمان اجرا (در حالی که برنامه در حال اجرا است) رخ می دهد.
- پلی مورفیسم پویا تصمیم میگیرد که یک روش در زمان اجرا کدام پیادهسازی خاص را داشته باشد.
- نادیده گرفتن روش نمونه ای از چندشکلی پویا است.
- late binding به معنای اختصاص دادن یک شی خاص، یک مرجع از نوع آن، یا سوپرکلاس آن است.
- وراثت با پلی مورفیسم پویا همراه است.
GO TO FULL VERSION