
39. اصلاح کننده های دسترسی در جاوا چیست؟ آنها را نام ببر. آنها برای چه مواردی مناسبند؟
من قبلاً در سؤالی در مورد عناصر جاوا که برای دستیابی به کپسولهسازی استفاده میشود، به اصلاحکنندههای دسترسی پرداختم. اما با این حال، من به شما یادآوری می کنم. اصلاح کننده های دسترسی در جاوا کلمات کلیدی هستند که سطح دسترسی اعطا شده به یک جزء خاص جاوا را توصیف می کنند. اصلاح کننده های دسترسی زیر وجود دارد:- public - عنصری که با این اصلاح کننده مشخص شده عمومی است. به عبارت دیگر، فیلدها و متدها و کلاسهای اعلامشده با اصلاحکننده عمومی برای سایر کلاسها هم در بسته خود و هم در بستههای خارجی قابل مشاهده هستند.
- محافظت شده - عنصری که با این اصلاح کننده علامت گذاری شده است، از هر جایی در کلاس خود در بسته فعلی یا کلاس های مشتق شده قابل دسترسی است، حتی اگر در بسته های دیگر باشند.
- پیشفرض (یا اصلاً اصلاحکننده وجود ندارد) به طور ضمنی زمانی اعمال میشود که هیچ اصلاحکننده دسترسی نشان داده نشده باشد. این شبیه به قبلی است، با این تفاوت که در کلاس های مشتق شده موجود در بسته های دیگر قابل مشاهده است.
- خصوصی - این خصوصی ترین در بین همه اصلاح کننده ها است. این اجازه دسترسی به یک عنصر را فقط در کلاس فعلی می دهد.
40- ویژگی های اصلی روش های ایستا و غیر ایستا را نام ببرید
تفاوت اصلی این است که متدهای استاتیک به یک کلاس تعلق دارند. در واقع، شما نیازی به ایجاد نمونه ای از این کلاس ندارید - روش های استاتیک را می توان فقط از نوع کلاس فراخوانی کرد. برای مثال، فرض کنید یک روش ثابت برای نوازش گربه داریم:public class CatService {
public static void petTheCat(Cat cat) {
System.out.println("Pet the cat: " + cat.getName());
}
برای فراخوانی آن به نمونه ای از کلاس CatService نیاز نداریم :
Cat cat = new Cat(7, "Bobby");
CatService.petTheCat(cat);
در مقابل، روشهای معمولی به یک شی محدود (متعلق) میشوند. برای فراخوانی آنها باید یک نمونه (ابجکت) داشته باشید که متد بر اساس آن فراخوانی شود. به عنوان مثال، فرض کنید گربه ما یک متد غیراستاتیک meow() دارد :
class Cat {
public void meow() {
System.out.println("Meow! Meow! Meow!");
}
برای فراخوانی این روش، به یک نمونه خاص از گربه نیاز داریم:
Cat cat = new Cat(7, "Bobby");
cat.meow();
41. محدودیت های اصلی که برای روش های ایستا و غیر ایستا اعمال می شود چیست؟
همانطور که قبلاً گفتم، محدودیت اصلی یک روش معمولی (غیر استاتیک) این است که همیشه باید نمونه ای وجود داشته باشد که متد بر اساس آن فراخوانی شود. اما یک روش استاتیک به این نیاز ندارد. علاوه بر این، یک متد استاتیک نمی تواند از این ارجاع به عناصر یک شی استفاده کند زیرا اکنون یک شی فعلی برای متد وجود دارد.42. کلمه کلیدی ثابت به چه معناست؟ آیا می توان یک روش استاتیک را overrid یا overload کرد؟
عنصری که با کلمه کلیدی ثابت مشخص شده است به نمونه ای از کلاس تعلق ندارد بلکه به خود کلاس تعلق دارد. زمانی بارگذاری می شود که خود کلاس بارگذاری شود. عناصر استاتیک برای کل برنامه یکسان هستند، در حالی که عناصر غیر استاتیک فقط برای یک شی خاص یکسان هستند. عناصر زیر می توانند ثابت باشند:- زمینه های یک کلاس؛
- بلوک اولیه یک کلاس؛
- متد یک کلاس؛
- کلاس های تو در تو یک کلاس (البته این هم یک توتولوژی است).
43. آیا یک روش می تواند در عین حال ایستا و انتزاعی باشد؟
من قبلاً در مقاله قبلی به این پاسخ گفتم: یک روش نمی تواند همزمان انتزاعی و ایستا باشد. اگر یک متد انتزاعی باشد، به این معنی است که باید در کلاس فرزند لغو شود. اما یک متد استاتیک متعلق به کلاس است و نمی توان آن را باطل کرد. این یک تناقض ایجاد می کند که کامپایلر متوجه آن می شود و از آن ناراحت می شود. اگر در این موقعیت قرار گرفتید، باید به طور جدی به درستی معماری برنامه خود فکر کنید (نکته: به وضوح مشکلی در آن وجود دارد).
44. آیا می توان از روش های ایستا در میانه روش های غیر استاتیک استفاده کرد؟ و بالعکس؟ چرا؟
می توانیم از روش های استاتیک در روش های غیر استاتیک استفاده کنیم. هیچ چیز مانع آن نمی شود. با این حال، برعکس آن ممکن نیست: یک متد استاتیک نمی تواند از یک روش غیر استاتیک بدون ارجاع به یک نمونه خاص از کلاس استفاده کند. به یاد داشته باشید که اعضای ایستا یک کلاس به این مرجع دسترسی ندارند : شما می توانید به تعداد دلخواه شیء ملموس کلاس داشته باشید و هر کدام از آنها حاوی یک این مرجع است که یک مرجع خود است. بنابراین چگونه تعیین کنیم که از کدام مرجع استفاده کنیم؟ اوه، شما نمی کنید. به همین دلیل است که عناصر ایستا نمی توانند بدون ارجاع به یک شی خاص به غیر ایستا اشاره کنند. اساساً، یک متد استاتیک تنها در صورتی می تواند از یک روش غیر استاتیک استفاده کند که به یک شی خاص اشاره داشته باشد. به عنوان مثال، یکی که به عنوان آرگومان متد وارد شده است:public static void petTheCat(Cat cat) {
System.out.println("Pet the cat: " + cat.getName());
}
در اینجا می بینیم که در متد static petTheCat ، getName را فراخوانی می کند ، یک متد غیراستاتیک معمولی از یک شی Cat .
45. رابط چیست؟ آیا یک رابط نهایی وجود دارد؟
به یاد می آوریم که جاوا ارث بری چندگانه ندارد. اینترفیس ها جایگزینی برای آن هستند. یک اینترفیس مانند یک کلاس بسیار حذف شده است. آنها عملکرد را تعریف می کنند اما یک پیاده سازی مشخص را ندارند. این کار به کلاس هایی واگذار می شود که این رابط ها را پیاده سازی می کنند. نمونه ای از رابط:public interface Animal {
void speak();
}
نمونه ای از پیاده سازی رابط توسط یک کلاس
class Cat implements Animal {
@Override
public void speak() {
System.out.println("Meow! Meow! Meow!");
}
}
نکته اصلی مهمی که در مورد استفاده از رابط ها باید بدانید در اینجا است:
-
متدهای واسط فقط باید حاوی هدر باشند. آنها نباید بدنه متد خاصی داشته باشند، یعنی باید انتزاعی باشند (البته از کلمه کلیدی انتزاعی استفاده نمی کنند ). استثنائاتی وجود دارد: روش های استاتیک و روش های پیش فرض که به بدنه متد نیاز دارند.
-
یک کلاس می تواند بسیاری از اینترفیس ها را پیاده سازی کند (همانطور که گفتم، اینترفیس ها جایگزینی برای وراثت چندگانه هستند). نامهای رابط در هدر متد با کاما از هم جدا میشوند: کلاس Lion پیادهسازی Animal، Wild .
-
رابط ها با استفاده از کلمه کلیدی رابط ایجاد می شوند .
-
هنگامی که یک کلاس یک رابط را پیاده سازی می کند، از کلمه کلیدی implements استفاده می کنیم .
-
کلاسی که یک اینترفیس خاص را پیاده سازی می کند باید تمام متدهای انتزاعی خود را پیاده سازی کند یا باید خود را انتزاعی اعلام کند.
-
هدف اصلی از استفاده از واسط ها پیاده سازی چندشکلی (به یک شیء توانایی گرفتن اشکال مختلف) است.
-
به عنوان یک قاعده، اصلاحکنندههای دسترسی برای متدها در رابطها نشان داده نمیشوند: آنها بهطور پیشفرض عمومی هستند و نمیتوانید اصلاحکنندههایی غیر از public را مشخص کنید . با شروع با جاوا 9، می توانید از اصلاح کننده های خصوصی روی روش ها استفاده کنید.
-
بهطور پیشفرض، متغیرهای رابط، نهایی ثابت هستند . به عبارت دیگر، آنها ثابت هستند - آنها همیشه باید مستقیماً در رابط مقداردهی اولیه شوند.
-
شما نمی توانید یک نمونه از یک رابط ایجاد کنید.

46. از کجا می توان فیلدهای استاتیک را مقدار دهی اولیه کرد؟
فیلدهای استاتیک را می توان مقدار دهی اولیه کرد:- بلافاصله پس از اعلام، با استفاده از علامت تساوی ( = );
- در یک بلوک اولیه سازی استاتیک؛
- در یک بلوک مقداردهی اولیه غیر استاتیک (اما باید بدانید که هر بار که یک شی ایجاد میشود، وقتی این بلوک اولیهسازی اجرا میشود، فیلد استاتیک بازنویسی میشود.
- در سازنده کلاس هر بار که سازنده فراخوانی می شود (یعنی هر بار که یک شی با استفاده از این سازنده ایجاد می شود)، فیلد بازنویسی می شود.
- در روش های استاتیک؛
- در روش های غیر استاتیک؛
- در کلاس های تودرتو ایستا و غیر ایستا، محلی و ناشناس.
47. کلاس های ناشناس چیست؟
کلاس های ناشناس کلاس هایی هستند که نوع خاص خود را ندارند. من در مورد چه چیزی صحبت می کنم؟ وقتی در مورد اینترفیس ها صحبت کردیم، اشاره کردم که شما نمی توانید نمونه ای از یک شی را ایجاد کنید: شما فقط می توانید یک نمونه از کلاسی ایجاد کنید که یک رابط را پیاده سازی می کند. اگر نمی خواهید کلاسی برای پیاده سازی اینترفیس وجود داشته باشد اما به شیئی نیاز دارید که رابط را پیاده سازی کند، چه؟ و این احتمالاً تنها کاربرد شیء است. و شما هیچ نیازی به ایجاد یک کلاس پیاده سازی کامل ندارید. چگونه آن را انجام می دهید؟ درست است! با استفاده از کلاس ناشناس!
public final interface Animal {
public void speak();
}
اگر بخواهیم از یک کلاس ناشناس برای نمونه سازی یک رابط داده شده استفاده کنیم:
Animal cat = new Animal() {
@Override
public void speak() {
System.out.println("Meow! Meow! Meow!");
}
};
و سپس، می توانید با خیال راحت از این شی و متد speak() پیاده سازی شده آن استفاده کنید . به عبارت دیگر، کلاس ناشناس رابط و تمام متدهای انتزاعی آن را در اینجا و اکنون پیاده سازی می کند. در غیر این صورت، ما نمیتوانیم یک شی کلاس واسط/انتزاعی ایجاد کنیم زیرا متدهای اجرا نشده/انتزاعی وجود دارد. همانطور که اشاره کردم، کلاس های ناشناس نه تنها برای پیاده سازی متدهای انتزاعی یک رابط، بلکه برای پیاده سازی متدهای انتزاعی یک کلاس انتزاعی نیز استفاده می شوند. این رویکرد برای موقعیتهایی خوب است که یک شی یک بار استفاده میشود یا زمانی که اجرای یک متد معین فقط یک بار مورد نیاز است. نیازی به ایجاد کلاس جداگانه ای نیست که کلاس/رابط انتزاعی مورد نیاز را پیاده سازی کند. اما به این نکته نیز اشاره می کنم که از کلاس های ناشناس به ندرت در کار استفاده می شود. به عنوان یک قاعده، کلاس های معمولی هنوز هم اولویت دارند. در این مقاله
می توانید در مورد کلاس های ناشناس بیشتر بخوانید .
48- طبقات اولیه چیست؟
من فکر می کنم این یک سوال گمراه کننده است، احتمالاً یک سوال ترفند، زیرا جاوا چیزی به نام کلاس های ابتدایی ندارد. فقط مفهوم انواع اولیه وجود دارد که قبلاً در نظر گرفتیم. به یاد می آوریم که جاوا دارای 8 نوع اولیه است: بایت ، کوتاه ، int ، طولانی ، شناور ، دوبل ، char ، بولی .49. کلاس wrapper چیست؟
مشکل اصلی استفاده از انواع اولیه در جاوا این است که کلاس نیستند و جاوا یک زبان OOP است. یعنی برنامه هایی که به این زبان نوشته می شوند به میزان تعامل بین اشیا هستند. اما بدوی اشیاء نیستند. آنها متدهایی ندارند، حتی متدهای استاندارد کلاس Object . اما اگر نیاز به استفاده از یک کلید به عنوان کلید در نقشه داشته باشیم، چه ؟ سپس باید متد ()hashCode آن را فراخوانی کنیم . همچنین می توانید متد () quals آن را در آنجا فراخوانی کنید. بعدش چی شد؟ لحظات بسیار زیادی وجود دارد که شما به یک کلاس نیاز دارید، نه یک کلاس ابتدایی. این باعث می شود عناصر اولیه غیر قابل استفاده و نامطلوب در یک برنامه باشند زیرا آنها ایده OOP را نقض می کنند. اما اوضاع آنقدرها هم که به نظر می رسد بد نیست. پس از همه، جاوا مفهوم wrapper های اولیه را دارد. در جاوا، هر نوع اولیه یک دوقلو دارد - یک کلاس wrapper.- byte -> Byte.class
- short -> Short.class
- int -> Integer.class
- long -> Long.class
- float -> Float.class
- double -> Double.class
- char -> Character.class
- boolean -> Boolean.class

50. کلاس تو در تو چیست؟ کجا استفاده می شود؟
کلاس تودرتو کلاسی است که خود عضوی از کلاس دیگری است. 4 نوع از این کلاس های تودرتو در جاوا وجود دارد: 1. کلاس داخلی این نوع کلاس مستقیماً در بدنه یک کلاس دیگر اعلام می شود. یک کلاس داخلی یک کلاس تودرتو غیراستاتیک است و می تواند به هر فیلد خصوصی یا روش نمونه کلاس خارجی دسترسی داشته باشد. به عنوان مثال، بیایید یک باغ وحش ایجاد کنیم که حاوی یک حیوان - گورخر است:public class Zoo {
class Zebra {
public void eat(String food) {
System.out.println("Zebra eats " + food);
}
}
}
پیچیده نیست، درست است؟ بیایید نگاهی به مثالی از ایجاد یک نمونه از کلاس داخلی بیندازیم:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.eat("apple");
همانطور که قبلاً دیدید، ابتدا لازم است یک شی از کلاس enclosing ایجاد کنید. سپس از مرجع شی برای ایجاد نمونه ای از کلاس داخلی استفاده می کنید. همچنین میخواهم به این نکته اشاره کنم که یک کلاس داخلی (کلاس تودرتوی غیراستاتیک) نمیتواند متدهای استاتیک یا فیلدهای استاتیک داشته باشد. این دقیقاً به این دلیل است که کلاس داخلی به طور ضمنی با نمونه ای از کلاس بیرونی خود مرتبط است و بنابراین نمی تواند هیچ روش ثابتی را در خود اعلام کند. 2. کلاس های تودرتو ایستا این کلاس ها مشابه دسته قبلی هستند، اما اصلاح کننده دسترسی استاتیک را در اعلان کلاس دارند. از آنجایی که این نوع کلاس به فیلدهای غیراستاتیک کلاس بیرونی دسترسی ندارد، بیشتر شبیه یک بخش ایستا از کلاس خارجی است تا یک کلاس داخلی. اما این کلاس به تمام اعضای استاتیک کلاس بیرونی حتی به خصوصی دسترسی دارد. مثالی از یک کلاس تودرتو ایستا:
public class Zoo {
static class Zebra {
public void eat(String food) {
System.out.println("Zebra eats " + food);
}
}
}
این به شکل کمی متفاوت از قبلی ایجاد شده است:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.eat("apple");
در اینجا برای ایجاد یک شی از کلاس تودرتو ایستا به یک شی از کلاس خارجی نیاز نداریم. ما فقط باید نام کلاس تودرتو را بدانیم تا آن را در کلاس بیرونی پیدا کنیم. 3. کلاس های محلی کلاس های محلی کلاس هایی هستند که در بدنه یک متد اعلام شده اند. اشیاء یک کلاس محلی فقط در متد enclosing قابل ایجاد و استفاده هستند. مثال:
public class Zoo {
public void feed(String animal, String food) {
switch(animal) {
case "zebra":
class Zebra {
public void eat(String food) {
System.out.println("Zebra eats " + food);
}
}
Zebra zebra = new Zebra();
zebra.eat(food);
...
در اینجا یک مثال است:
Zoo zoo = new Zoo();
zoo.feed("zebra", "apple");
اگر کد متد ()feed را نمی دیدید ، حتی به وجود یک کلاس محلی هم مشکوک نمی شدید؟ یک کلاس محلی نمی تواند ثابت یا گذرا باشد ، اما می تواند به عنوان انتزاعی یا نهایی علامت گذاری شود (یکی یا دیگری، اما نه هر دو، زیرا استفاده همزمان از این دو اصلاح کننده باعث ایجاد تضاد می شود). 4. کلاس های ناشناس قبلاً در مورد کلاس های ناشناس در بالا صحبت کردیم، و همانطور که به یاد دارید، آنها را می توان از دو منبع ایجاد کرد - رابط ها و کلاس ها. دلایل استفاده از آنها از کلاس های استاتیک و غیراستاتیک تودرتو استفاده می شود زیرا گاهی اوقات بهتر است کلاس های کوچک را در کلاس های عمومی تر قرار دهیم و در کنار هم نگه داریم تا انسجام بالاتر و هدف مشترکی داشته باشند. اساساً، کلاسهای تودرتو به شما امکان میدهند کپسولهسازی کدتان را افزایش دهید. اگر کلاس به طور انحصاری در یک متد مورد استفاده قرار گیرد، میتوانید از یک کلاس محلی استفاده کنید. در این صورت، آیا باید کد را روی اپلیکیشن پخش کنیم؟ خیر. همانطور که گفتم، اضافه میکنم که در تجربهام هرگز ندیدهام کسی از کلاسهای محلی استفاده کند، زیرا نیاز یا عدم نیاز آنها بسیار بحث برانگیز است. هنگامی که یک پیاده سازی خاص از یک رابط یا یک کلاس انتزاعی فقط یک بار مورد نیاز است، ممکن است از کلاس های ناشناس استفاده کنید. در این صورت نیازی به ایجاد یک کلاس مجزا و کامل با یک پیاده سازی نیست. در عوض، ما آن را ساده نگه داشتیم و متد(های) مورد نیاز خود را با استفاده از یک کلاس ناشناس پیاده سازی کردیم، از شی استفاده کردیم و سپس آن را فراموش کردیم (البته زباله جمع کن فراموش نکرد). درک شما از کلاس های تو در تو با مقاله اینجا افزایش می یابد.
51. یک کلاس چه تغییر دهنده دسترسی می تواند داشته باشد؟
انواع مختلفی از کلاس ها وجود دارد و اصلاح کننده های دسترسی متفاوتی برای آنها اعمال می شود:- یک کلاس خارجی می تواند اصلاح کننده دسترسی عمومی یا اصلاً اصلاح کننده نداشته باشد (اصلاح کننده پیش فرض).
- یک کلاس داخلی (کلاس تو در تو غیر ایستا) می تواند هر یک از 4 اصلاح کننده دسترسی را داشته باشد.
- یک کلاس استاتیک تودرتو میتواند هر یک از اصلاحکنندههای دسترسی را داشته باشد، به جز محافظت شده ، زیرا این اصلاحکننده به ارث بردن دلالت میکند، که با هر عضو ثابت کلاس در تضاد است (اعضای استاتیک به ارث نمیرسند).
- یک کلاس محلی فقط می تواند اصلاح کننده پیش فرض داشته باشد (یعنی اصلاً اصلاح کننده ای وجود ندارد).
- یک کلاس ناشناس هیچ اعلان کلاس ندارد، بنابراین اصلاً اصلاح کننده دسترسی ندارد.

GO TO FULL VERSION