رفتن به مطلب

سوالات تخصصی جاوا (java interview questions) به همراه جوابهای آنها


سارا-افشار

ارسال های توصیه شده

درود

توی این تاپیک قصد دارم سوالات تخصصی در مورد زبان برنامه نویسی جاوا رو به همراه جوابهایشان قرار دهم .امیدوارم توی این کار منو همراهی کنید :w16:

 

همانطور که می دونید این نوع سوال ها بیشتر سوالات عمومی و از منظر برنامه نویسی و به جهت سنجش میزان مهارت برنامه نویس در آزمون های بین المللی / مصاحبه های تخصصی شرکتها طرح می شوند .

 

پ.ن یک : شاید خیلی از ماها سالها کد بزنیم ولی جواب خیلی از این سوالات رو ندونیم

پ.ن دو : من این سوالات رو از منابع انگلیسی زبان استخراج می کنم

  • Like 4
لینک به دیدگاه

سوال اول : چرا از نظر امنیتی بهتراست جهت پیاده سازی / ذخیره کردن داده های حساس (مانند رمز عبورها ) از آرایه ای از رشته ها بجای استفاده از شیی رشته استفاده کنیم ؟

 

بخاطر اینکه دادهایی که درشیی از نوع String ذخیره می شوند به اصطلاح غیر قابل تغییر(immutable) هستند یعنی به محض اینکه شیی ایجاد می شود دیگر نمی شود زمان نابود شدن اون رو تعیین کرد بلکه این وظیفه برعهده آشغال جمع کن (garbage) جاوا هست و خود این باعث می شود مقدار داده ذخیره شده در شیی String در حافظه تا زمان نامعلومی باقی بماند و در صورت دسترسی غیر مجاز به حافظه توسط فرد غیر خودی حریم این داده ها نقض شده و مورد دسترسی غیر مجاز واقع شوند . برای جلوگیری از این کار بهتر است برای ذخیره داده های حساس مانند رمز عبور از آرایه ای از رشته ها (مثلا StringBuilder) استفاده شود طوری که خود برنامه نویس می تواند هر زمان که خواست محتوای آن را خالی کرده و از بین ببرد .

  • Like 4
لینک به دیدگاه

سوال دوم : برای اینکه اجازه ندهیم از یک کلاس زیرکلاسی ایجاد نشود چکار باید بکنیم ؟

جواب : آن را به صورت final تعریف کنیم دراین صورت از اون کلاس فقط می شود شیی هایی (نمونه هایی ) ایجاد شود ولی نمی توانیم از آن ارث ببریم . به اصطلاح عامیانه آن کلاس را عقیم می کنیم یعنی هیچ کلاسی نمی تواند از این کلاس ارث ببرد .

 

به عنوان مثال :

 



Public final class A {
}

Public class B extends A { // this is forrbidden because class A is a final class
}

  • Like 4
لینک به دیدگاه
سوال دوم : برای اینکه اجازه ندهیم از یک کلاس زیرکلاسی ایجاد نشود چکار باید بکنیم ؟

جواب : آن را به صورت final تعریف کنیم دراین صورت از اون کلاس فقط می شود شیی هایی (نمونه هایی ) ایجاد شود ولی نمی توانیم از آن ارث ببریم . به اصطلاح عامیانه آن کلاس را عقیم می کنیم یعنی هیچ کلاسی نمی تواند از این کلاس ارث ببرد .

 

به عنوان مثال :

 



Public final class A {
}

Public class B extends A { // this is forrbidden because class A is a final class
}

 

هیچوقت نتونستم این مساله رو هضم کنم که چرا باید یک کلاس رو عقیم کرد؟

به نظر شما ما بیایم چندتا کلاس را به صورت final تعریف کنیم چه چیزی دستگیرمون میشه؟

  • Like 3
لینک به دیدگاه
هیچوقت نتونستم این مساله رو هضم کنم که چرا باید یک کلاس رو عقیم کرد؟

به نظر شما ما بیایم چندتا کلاس را به صورت final تعریف کنیم چه چیزی دستگیرمون میشه؟

اتفاقا وقتی داشتم اینومیخوندم واسم این سوال ایجاد شد

رفتم سرچ کردم یه جوابی توی stackoverflow پیدا کردم که خب درکل اینجوری گفته بود که در مواقعی که نمی تونیم برهم کنش کلاسهای والد با فرزندان رو پیش بینی کنیم (منجر بشه به رفتارهای غیر قابل کنترل ) اینجاست که اون کلاس رو final اعلام می کنیم

  • Like 4
لینک به دیدگاه

سوال اول : آیا می توانیم یک Constructor را به صورت final تعریف کنیم ؟

 

 

جواب : خیر

 

سوال دوم : آیا Constructor یک کلاس می تواند به ارث برده شود؟

جواب :خیر

 

چرا ؟

 

برای اینکه طبق قانون ارث بری در جاوا ، هر کلاسی می تواند اعضای کلاس والد (super class) را به ارث ببرد منظور از اعضا یعنی تمامی فیلد ها ، متدها و کلاسهای تو درتوی کلاس والد . درحالی که constructor جزو اعضای یک کلاس محسوب نمی شود بلکه فقط می توانیم آن را در داخل زیر کلاس ها فراخوانی کنیم .

با توجه به تو ضیحات بالا اگر ما دو کلاس A و B رو داشته باشیم :



class A {
A(){
}




}


class B extends A {


B(){
}


}
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

سوال سوم : مقدار برگشتی یک Constructor چیست ؟

 

 

 

جواب :یک نمونه از شیی از کلاس مورد نظر ، اما در حالت کلی اگر سوال به این صورت بود که آیا Constructor ها مقدار برگشتی دارند جواب ما نه خیر است

  • Like 5
لینک به دیدگاه

سوال اول : آیا میشه یک پروژه بدون متد main داشته باشیم ؟

 

 

جواب : بله (البته برای نسخه های jdk کمتر از هفت ، چرا که برای نسخه هفت و بالاتر این قابلیت حذف شده است ) .

 

چطوری ؟

 

 

با ایجاد یک بلاک static در داخل کلاس

مثال :



[/color]class A3{
static{
System.out.println("static block is invoked");
System.exit(0);
}
}
[color=#000000]
برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

و خروجی :


Output:static block is invoked
Hello main

 

  • Like 4
لینک به دیدگاه

سوال پنجم : تفاوت بین زبانهای برنامه نویسی شی گرا و زبانهای برنامه نویسی مبتنی بر شی درچیست ؟

 

 

جواب :زبانهای برنامه نویسی مبتنی بر شیی همه ویژگی های OOP (برنامه نویسی شی گرایی ) رو رعایت می کنند به استثنای ارث بری

مثال هایی از که زبانهای برنامه نویسی مبتنی بر شی گرایی می توان نام برد عبارتند از javascript و VBscript و...

 

  • Like 4
لینک به دیدگاه

سوال اول : مزایای overloading کردن متدها چیست ؟

جواب :اول بگم که منظور از overloading کردن متدها یعنی متدهایی داشته باشیم که هم اسم باشند ولی تعداد و نوع داده آرگومانهایشان فرق داشته باشند اما جواب سوال این است که اینکار باعث افزایش خوانایی کد می شود (کار برنامه نویس هم حین کد نوشتن راحت می کند)

 

سوال دوم : معایب overloading کردن متدها چیست ؟

جواب :باعث بار کردن کدهای زیاد و کند شدن سرعت کامپایل کردن برنامه می شود ( اینو کامل مطمئن نیستم یه چیزایی از کتاب هربرت شیلد یادم مونده بود در مورد سرعت ).

 

سوال سوم : در چه صورت overloading کردن متدها با شرایط بالایی (نام آرگومان یکیسان ولی تعدادو نوع داده های متفاوت ) باعث خطای کامپایل می شود ؟

 

جواب : درصورتی که دو متد با نام یکسان و تعداد آرگومانهای یکسان و نوع داده هایی که قابل تبدیل به یکدیگر نباشند به زبان ساده هرجا که کامپایلر گیج بشود و برایش به اصطلاح ابهام (ambiguity) ایجاد شود .

به مثال زیر برای فهمیدن منظور سوال توجه کنید :

 



class OverloadingCalculation3{
void sum(int a,long b){System.out.println("a method invoked");}
void sum(long a,int b){System.out.println("b method invoked");}

public static void main(String args[]){
OverloadingCalculation3 obj=new OverloadingCalculation3();
obj.sum(20,20);//now ambiguity
}
}

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

  • Like 4
لینک به دیدگاه
  • 2 هفته بعد...

سوال اول : مفهوم Abstract در جاوا چیست ؟

 

جواب : کلا اگر بخواهیم جزییات پیاده سازی و پیچیدگی های مربوط به آن را از دید کاربر مخفی و توجه او رو تنها بر عملکرد یک فرایند جلب کنیم از مفهوم انتزاع (Abstract) استفاده می کنیم . کلا تو انتزاع ما با این سوال مواجه می شویم :

"آن شیی چه کار می کند بجای اینکه بپرسیم آن شیی چطور انجام می دهد "

 

 

سوال دوم : روش های دستیابی به انتزاع (Abstract) درجاوا چگونه است ؟

جواب : به دو طریق در جاوا می توانیم به انتزاع دست یابیم :

1- کلاس ( از صفر تا 100 درصد )

2- واسط ها ( 100 درصد )

 

 

سوال سوم : منظور از کلاس انتزاعی از صفر تا 100 درصدی یعنی چه ؟

جواب : کلاسهایی که با کلمه کلیدی abstract اعلان می شوند و درضمن تمامی متدهای آنها بدون بدنه اعلان می شوند ایناها کلاس های 100 در100 انتزاعی هستند به مثال توجه کنید


abstract class Bike{
abstract void run();
}

[right]
[/right]



برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

کلاسی که خود عنوان کلاس دارای کلید واژه abstract داشته باشه و دست کم در یکی از متدهاش نیز از این کلید واژه استفاده شده ولی بقیه متدهایش کاملا پیاده سازی شده باشند در آن صورت می گوییم میزان انتزاع کلاسی بین صفر تا 100 درصد هست .

 

 

به مثال توجه کنید :


abstract class Bike{
Bike(){System.out.println("bike is created");}
abstract void run();
void changeGear(){System.out.println("gear changed");}
}

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

سوال پنج : آیا می شود یک کلاسی را هم abstract و هم final تعریف کنیم ؟

جواب : خیر چون اصلا ما کلاسی را به این خاطر abstract تعریف می کنیم که کلاس هایی که از این کلاس ارث می برند بتواندد آن را کامل کنند (یعنی متدهای انتزاعی اونو پیاده سازی کنند) . به عبارت ساده تر تعریف کلاسی با کلیدواژه abstract یعنی اعلان می کنیم این کلاس باید extends بشود تا بتواند کامل بشود .

  • Like 4
لینک به دیدگاه

واسط ها یا همون interface ها جزو مفاهیم کلیدی در دنیای شی گرایی و البته جاوا دارند .

خود من خیلی جاها که خواستم از API های جاوا استفاده کنم (حالا چه تو محیط نرمال و استاندارد جاوایی ، چه تو محیط JAVA AGENT و چه حالا که با اندروید سروکار دارم ) بیشتر وقتا هنگام مواجه با API هایی که نقش واسط رو بازی می کنن گیر می کنم احساس می کنم هنوز که باید و شاید نتونستم از این ابزارهای کلیدی استفاده درست ببرم . شاید بیشتر بخاطر این بوده که در اکثر مواقع نقش کدزن (جرات ندارم هنوز خودمو برنامه نویس بدونم ) رو برعهده داشتم تا نقش تحلیلگر و طراح نرم افزار .

من خیلی جاها اشیای دور و برم رو درنهایت به صورت کلاس می بینم خیلی به ندرت پیش اومده خودمو درگیر واسط ها کنم یا حتی همون کلاسهای انتزاعی که در پست قبلی درموردشان صحبت کردم . اما تصمیم دارم بیشتر روی این دو مفهوم و ابزار کلیدی در شی گرایی و بخصوص جاوا زوم کنم .

همانطور که میدونید در جاوا امکان وراثت چندگانه وجود ندارد (به علت به وجود آمدن ابهام درحین کامپایل ) یعنی ما هرگز نمی توانیم کلاسی به فرم زیر تعریف کنیم :



class A {
}




class B{
}




class C extends A,B{
}

برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

 

همانطور که در مثال می بینید کلاس testinterface1 دوتا واسط را پیاده سازی می کند که اتفاقا هر دوی آنها دارای یک متد انتزاعی یکسانی هستند این کلاس اومده در داخل بدنه خود متد این واسط ها یعنی print رو پیاده سازی کرده است اما اگر بجای این واسط ها ، درجاوا وراثت چندگانه کلاسها مجاز بود یعنی فرض کنید کلاس testinterface1 از دو کلاس بالایی به ارث می برود به صورت زیر :


class Printable{
void print(){
;
}
}

class Showable{
void print(){; }
}

class testinterface1 extends Printable,Showable{



public static void main(String args[]){
testinterface1 obj = new testinterface1();
obj.print();
}
}


برای مشاهده این محتوا لطفاً ثبت نام کنید یا وارد شوید.

  • Like 3
لینک به دیدگاه

سوال اول : marker or tagged interface چیست ؟

 

جواب : به واسطی که هیچ عضوی نداشته باشد marker or tagged interface گفته می شود از معروف ترین این واسط ها Serializable , Clonable و... می باشند آنها به این خاطر استفاده می شوند که یکسری اطلاعات ضروری و اساسی را برای JVM فراهم کنند تا اون بتواند یکسری علمیات مفید را انجام دهد . برای مثال وقتی ما شیی رو به صورت Serializable معرفی می کنیم درواقع با این کار به JVM می گوییم این شیی تنها روی حافظه اصلی قرار نگرفته بلکه باید بسته بندی شده (wrapp) شده و روی یک فایل خارجی خوابانده شود و الی آخر .

 

 

سوال دوم : آیا متدهای یک واسط را می توان به صورت استاتیک تعریف کرد ؟

جواب : خیر به خاطر اینکه این متدها به صورت پیش فرض abstract تعریف شدند درنتیجه دو کلیدواژه abstrac و static نمی توانند کنار هم بیایند

 

 

سوال سوم : آیا یک واسط را می توان به صورت final تعریف کرد :

جواب : واسط هم مانند کلاسهای انتزاعی اصلا برای این تعریف شدند که از آنها استفاده بشود طوری که بشود آنها را توسعه داد و تعریف های اختصاصی از ان ها داشت درحالی که ذات کلمه کلیدی final چنین اجازه ای را نمی دهد .

 

در جدول شکل زیر تفاوت هایی که بین یک واسط و یک کلاس انتزاعی وجود دارد آمده است اون بند دو که با کادر قرمز نشون دادم درست نیس یعنی ما به صورت مستقیم نمی توانیم از یک کلاس انتزاعی نمونه سازی کنیم (من با استناد به کتاب هربرت شیلد اینو می گم ) .

jai3nssa0bv59mnygv7q.jpg

 

سوال چهارم : آیا ما اعضای یک واسط را می توانیم به صورت private و protected معرفی کنیم ؟

جواب : خیر تمامی اعضای یک واسط به صورت پیش فرض و ضمنی public هستند .

 

سوال پنجم : چه موقع یک شی ارجاعی (reference object) می تواند به یک واسط ارجاعی (reference interface) کست (cast) بشود ؟

جواب : موقعی که آن شی قبلش آن واسط را پیاده سازی کرده باشد

 

 

  • Like 3
لینک به دیدگاه
×
×
  • اضافه کردن...