JavaRush /Java блогы /Random-KK /10 абстрактілі сыныптар мен интерфейстер Java сұхбат сұра...

10 абстрактілі сыныптар мен интерфейстер Java сұхбат сұрақтары

Топта жарияланған
Абстрактілі класстар мен интерфейстер барлық an objectілі-бағытталған бағдарламалау тілдерінде өте танымал. Әр Java сұхбатында сіз осы тақырып бойынша кем дегенде бір сұраққа тап боласыз. Бағдарламалық жасақтама жасаушылар арасында танымал болғандықтан интерфейстер жиі айтылады, бірақ абстрактілі сыныптар туралы сұрақтар да мезгіл-мезгіл туындайды. Соңғысы көбінесе Java әзірлеуде екі жылдан аспайтын тәжірибесі бар кіші әзірлеушілер лауазымына үміткерлерден сұралады, ал интерфейстер туралы сұрақтар тәжірибесі төрт жылдан асқан адамдармен сұхбат кезінде жиі кездеседі. Олар әдетте Декоратор немесе Зауыттық үлгілер сияқты Java дизайн үлгілері туралы басқа сұрақтармен бірге сұралады. 10 абстрактілі сыныптар мен интерфейстер Java сұхбат сұрақтары - 1Бұл мақалада біз Java сұхбаттарының әртүрлі деңгейлерінде қойылған дерексіз сыныптар мен интерфейстер туралы жалпы сұрақтарды қарастырамыз. Олардың көпшілігі тіпті жаңа бастаған Java бағдарламашысы үшін де қиын болмауы керек. Бұл негізінен таза білім сұрақтары, бірақ олардың кейбіреулері, мысалы, абстрактілі сыныптар мен Java интерфейстері арасындағы айырмашылықтар немесе интерфейске абстрактілі классты қашан таңдау керек сияқты , өте қиын болуы мүмкін. Біз сізге тақырып бойынша ондаған қызықты сұрақтарды ұсынамыз.
Егер сізге сұхбат кезінде сұрақ қойылса немесе абстрактілі сабақтар мен интерфейстер туралы маңызды сұрақ қоюға тура келсе, бірақ ол бұл тізімде жоқ болса, оны түсініктемелерде бөлісіңіз.

1. Абстрактілі класстың Java тілінде конструкторлары болуы мүмкін бе?

Иә, Java тіліндегі абстрактілі сыныпта конструкторларды жариялауға және анықтауға болады. Абстрактілі кластардың даналарын құру мүмкін болмағандықтан, мұндай конструкторды конструкторлар тізбегін қалыптастыру кезінде, яғни нақты іске асыру класының данасын құру кезінде ғана шақыруға болады. Бірақ интервьюер сұрақ қояды деп елестетіп көріңізші: егер сіз бәрібір дерексіз класс данасын жасай алмасаңыз, конструктордың мәні неде? Мәселе мынада, ол әлі де абстрактілі сыныпта жарияланған және әртүрлі енгізулермен қолданылатын жалпы айнымалылардың бастапқы мәндерін орнату үшін пайдаланылуы мүмкін. Ешбір конструкторды жарияламасаңыз да, компилятор дерексіз сыныпқа әдепкі аргументсіз конструкторды қосады. Онсыз сіздің ішкі сыныбыңыз компиляцияланбайды, себебі кез келген конструктордағы бірінші мәлімдеме super()Java-дағы әдепкі суперкласс конструкторына жасырын шақыру болып табылады.

2. Java тіліндегі абстрактілі класстар интерфейстерді жүзеге асыра алады ма? Олар барлық әдістерді жүзеге асыруы керек пе?

Иә, дерексіз сыныптар интерфейстерді пайдалана алады implements. Олар дерексіз болғандықтан, барлық әдістерді жүзеге асыру талап етілмейді. Түрді жариялау үшін дерексіз базалық сынып пен интерфейстің болуы ұсынылатын тәжірибе болып табылады. Мысал интерфейс java.util.Listжәне сәйкес абстрактілі класс болып табылады java.util.AbstractList. Ол барлық жалпы әдістерді жүзеге асыратындықтан , нақты іске асырулар ( және AbstractListсияқты ) интерфейсті тікелей жүзеге асырған жағдайда барлық әдістерді жүзеге асырудың қажеті жоқ . Бұл шешім бір жерде барлық жалпы әрекетті жүзеге асыру үшін абстрактілі сыныптың икемділігімен түрді жариялау үшін интерфейсті пайдаланудың артықшылығын біріктіреді. Джошуа Блохтың «Java. Тиімді бағдарламалау» Java тіліндегі интерфейстер мен абстрактілі сыныптарды пайдалану тақырыбына арналған тамаша тараудан тұрады, оны жақсы түсіну үшін оны зерделеу мағынасы бар. LinkedListArrayListList

3. Абстрактілі сынып қорытынды болуы мүмкін бе?

Жоқ, ол алмайды. Кілт сөз finalсыныптың иерархияның жоғарғы жағында екенін және ұрпақтары болмауын білдіреді. Ал мұрагерлері жоқ дерексіз класс - бұл вакуумдағы сфералық жылқы, өйткені дананы жасау мүмкін емес abstract class. Осылайша, егер сынып екеуі abstractде болса final, онда оның ұрпақтары жоқ және оны құру мүмкін емес. abstractЕгер сіз класс жасасаңыз және Java компиляторы қате жібереді final.

4. Java тіліндегі абстрактілі класстың статикалық әдістері болуы мүмкін бе?

Иә, дерексіз сыныптар статикалық әдістерді жариялай және анықтай алады. Java-да статикалық әдістерді құрудың жалпы принциптерін сақтау ғана қажет, өйткені олар an objectіге бағытталған дизайнда қажет емес, өйткені Java-да статикалық әдістерді жоққа шығару мүмкін емес. Абстрактілі сыныптағы статикалық әдістер өте сирек кездеседі, бірақ егер оның жақсы себептері болса, оларды пайдалануға ештеңе кедергі болмайды.

5. Абстрактілі классты құруға болады ма?

Жоқ, сіз мұны істей алмайсыз. Абстрактілі класстың мәні оның толық еместігінде және оны ұрпақ кластарында аяқтау қажет. Яғни, бұл сынып пайдалануға дайын емес. Мысалы, оған кейбір әдістерді енгізу жетіспеуі мүмкін. Класс пайдалануға дайын болмағандықтан, оның нысанын жасау мүмкін емес. Бірақ абстрактілі класс мұрагерлерінің даналарын жасауға болады. Бағдарлама абстрактілі сыныпты құруға әрекеттенсе, Java компиляторы қате жібереді.

6. Абстрактілі сыныпта абстрактілі әдістер болуы керек пе?

Жоқ, абстрактілі сыныпта дерексіз әдістер болмауы мүмкін. Сіз Java тілінде класс рефератын abstractоның декларациясындағы кілт сөзді пайдалану арқылы жасай аласыз. Компилятор кез келген құрылымдық шектеулерді орындайды, мысалы, осы сыныптың данасын жасауға рұқсат бермеу. Айтпақшы, абстрактілі сыныпта немесе интерфейсте дерексіз әдістер болуы керек пе деген сұрақ даулы. Менің ойымша, абстрактілі сыныпта абстрактілі әдістер болуы керек, өйткені бұл абстрактілі сыныпты көргенде программист ойлайтын бірінші нәрсе. Бұл тосын жағдайларды азайту принципіне жақсы сәйкес келеді.

7. Java тіліндегі абстрактілі класс пен интерфейстің қандай айырмашылықтары бар?

Бұл ең маңызды және ең классикалық Java сұхбат сұрақтарының бірі. Мен бұл сұрақты барлық деңгейдегі Java сұхбаттарында қанша рет көргенімді санай алмаймын. Бұл сұрақты қызықтыратын нәрсе, атап айтқанда, өтініш берушіге мысал келтіру мүмкіндігі. Абстракция, инкапсуляция, полиморфизм және мұрагерлік сияқты an objectілі-бағытталған бағдарламалау негіздері туралы сұрақтарға жауап беру оңай, бірақ мұндай нәзік нюанстарға келгенде, жұмысқа үміткерлер жиі шатастырады және бірінші ойға келетін нәрсені айтады. Бұл сұрақтың жауабы бөлек мақалаға лайық (әсіресе Java 8-дегі өзгерістерден кейін), бірақ қысқаша айтқанда:
  • Интерфейс тек an objectінің әрекетін (әдістерін) сипаттайды, бірақ оның күйлері (өрістері) жоқ (болмайды public static final), ал абстрактілі сыныпта олар болуы мүмкін.

  • Абстрактілі класс тұқым қуалайды (кеңейтеді), ал интерфейс жүзеге асырылады (іске асырады). Біз тек бір классты мұра ете аламыз, бірақ қалағанымызша көптеген интерфейстерді жүзеге асыра аламыз. Интерфейс басқа интерфейсті/интерфейстерді кеңейте алады (кеңейте алады).

  • Абстрактілі класстар "is-a" қатынасы болған кезде қолданылады, яғни ішкі класс базалық абстрактілі классты кеңейтеді, ал интерфейстер бір-бірімен мүлдем байланысы жоқ әртүрлі класстармен жүзеге асырылуы мүмкін.

8. Интерфейске абстрактілі классқа артықшылық беру қай кезде мағынасы бар және керісінше?

Бұл абстрактілі сыныптар мен интерфейстер бойынша алдыңғы сұрақтардың жалғасы. Олардың синтаксистік айырмашылықтары қандай екенін білсеңіз, бұл сұраққа жауап беру сізге қиындық тудырмайды, өйткені олар шешім қабылдауда анықтаушы фактор болып табылады. Жарияланған интерфейске жаңа әдісті қосу іс жүзінде мүмкін емес болғандықтан, одан әрі дамытудың ықтимал қажеттілігі жағдайында абстрактілі классты қолданған дұрыс. Java тілінде абстрактілі сыныптарды әзірлеу интерфейстерді әзірлеуге қарағанда оңайырақ. Сол сияқты, егер интерфейсте тым көп әдістер болса және олардың барлығын іске асыру нағыз бас ауруына айналса, әдепкі іске асыру үшін абстрактілі класс жасаған дұрыс. Бұл үлгі Java жинақтары бумасында орындалады, дерексіз AbstractListкласс List. Абстрактілі сыныптарды пайдаланыңыз, егер:
  • Кодты бірнеше тығыз байланысты сыныптар арасында бөліскіңіз келеді.

  • Сіз абстрактілі классыңызды кеңейтетін сыныптарда ортақ көптеген әдістер немесе өрістер болуын немесе public(мысалы, protectedжәне private) емес басқа қатынас модификаторларын талап ететінін күтесіз.

  • не-finalСіз статикалық емес немесе өрістерді жариялағыңыз келеді . Бұл қол жеткізуге және олар тиесілі нысанның күйін өзгертуге болатын әдістерді анықтауға мүмкіндік береді.
Интерфейстерді пайдаланыңыз, егер:
  • Интерфейсіңізді іске асыру үшін байланысы жоқ сыныптарды күтесіз. Мысалы, интерфейстер Comparableжәне Cloneableкөптеген байланысы жоқ сыныптар арқылы жүзеге асырылады.

  • Сіз белгілі бір деректер түрінің әрекетін анықтағыңыз келеді, бірақ оны кім жүзеге асыратыны сізді қызықтырмайды.

  • Бірнеше түрдегі мұраны пайдаланғыңыз келеді.

9. Java тіліндегі абстрактілі әдіс дегеніміз не?

Абстрактілі әдіс - денесі жоқ әдіс. abstractСіз әдіс декларациясында кілт сөзді пайдаланып, оны анықтамай жай ғана жариялайсыз . Java тіліндегі интерфейс ішінде жарияланған барлық әдістер әдепкі бойынша дерексіз болып табылады. Java тіліндегі дерексіз әдістің мысалы:
public void abstract printVersion();
Енді бұл әдісті жүзеге асыру үшін абстрактілі классты кеңейтіп, бұл әдісті қайта анықтау керек.

10. Java тіліндегі абстрактілі класс әдісті қамтуы мүмкін бе main?

Иә, Java тіліндегі дерексіз класс әдісті қамтуы мүмкін main, себебі бұл жай ғана басқа статикалық әдіс және абстрактілі сыныпты mainсіз оны жасамасаңыз, әдіс арқылы орындауға болады. Менің саған айтқым келгені осы болды. Есіңізде болсын: абстрактілі сыныптар мен интерфейстер an objectілі-бағытталған талдау және жобалау процесіндегі негізгі дизайн шешімдері болып табылады және икемді жүйені құрғыңыз келсе, әрине, сақтықпен пайдаланылуы керек.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION