Абстрактілі класстар мен интерфейстер барлық an objectілі-бағытталған бағдарламалау тілдерінде өте танымал. Әр Java сұхбатында сіз осы тақырып бойынша кем дегенде бір сұраққа тап боласыз. Бағдарламалық жасақтама жасаушылар арасында танымал болғандықтан интерфейстер жиі айтылады, бірақ абстрактілі сыныптар туралы сұрақтар да мезгіл-мезгіл туындайды. Соңғысы көбінесе Java әзірлеуде екі жылдан аспайтын тәжірибесі бар кіші әзірлеушілер лауазымына үміткерлерден сұралады, ал интерфейстер туралы сұрақтар тәжірибесі төрт жылдан асқан адамдармен сұхбат кезінде жиі кездеседі. Олар әдетте Декоратор немесе Зауыттық үлгілер сияқты Java дизайн үлгілері туралы басқа сұрақтармен бірге сұралады.
Бұл мақалада біз Java сұхбаттарының әртүрлі деңгейлерінде қойылған дерексіз сыныптар мен интерфейстер туралы жалпы сұрақтарды қарастырамыз. Олардың көпшілігі тіпті жаңа бастаған Java бағдарламашысы үшін де қиын болмауы керек. Бұл негізінен таза білім сұрақтары, бірақ олардың кейбіреулері, мысалы,
абстрактілі сыныптар мен Java интерфейстері арасындағы айырмашылықтар немесе
интерфейске абстрактілі классты қашан таңдау керек сияқты , өте қиын болуы мүмкін. Біз сізге тақырып бойынша ондаған қызықты сұрақтарды ұсынамыз.
Егер сізге сұхбат кезінде сұрақ қойылса немесе абстрактілі сабақтар мен интерфейстер туралы маңызды сұрақ қоюға тура келсе, бірақ ол бұл тізімде жоқ болса, оны түсініктемелерде бөлісіңіз. |
1. Абстрактілі класстың Java тілінде конструкторлары болуы мүмкін бе?
Иә, Java тіліндегі абстрактілі сыныпта конструкторларды жариялауға және анықтауға болады. Абстрактілі кластардың даналарын құру мүмкін болмағандықтан, мұндай конструкторды конструкторлар тізбегін қалыптастыру кезінде, яғни нақты іске асыру класының данасын құру кезінде ғана шақыруға болады. Бірақ интервьюер сұрақ қояды деп елестетіп көріңізші: егер сіз бәрібір дерексіз класс данасын жасай алмасаңыз, конструктордың мәні неде? Мәселе мынада, ол әлі де абстрактілі сыныпта жарияланған және әртүрлі енгізулермен қолданылатын жалпы айнымалылардың бастапқы мәндерін орнату үшін пайдаланылуы мүмкін. Ешбір конструкторды жарияламасаңыз да, компилятор дерексіз сыныпқа әдепкі аргументсіз конструкторды қосады. Онсыз сіздің ішкі сыныбыңыз компиляцияланбайды, себебі кез келген конструктордағы бірінші мәлімдеме
super()
Java-дағы әдепкі суперкласс конструкторына жасырын шақыру болып табылады.
2. Java тіліндегі абстрактілі класстар интерфейстерді жүзеге асыра алады ма? Олар барлық әдістерді жүзеге асыруы керек пе?
Иә, дерексіз сыныптар интерфейстерді пайдалана алады
implements
. Олар дерексіз болғандықтан, барлық әдістерді жүзеге асыру талап етілмейді. Түрді жариялау үшін дерексіз базалық сынып пен интерфейстің болуы ұсынылатын тәжірибе болып табылады. Мысал интерфейс
java.util.List
және сәйкес абстрактілі класс болып табылады
java.util.AbstractList
. Ол барлық жалпы әдістерді жүзеге асыратындықтан , нақты іске асырулар ( және
AbstractList
сияқты ) интерфейсті тікелей жүзеге асырған жағдайда барлық әдістерді жүзеге асырудың қажеті жоқ . Бұл шешім бір жерде барлық жалпы әрекетті жүзеге асыру үшін абстрактілі сыныптың икемділігімен түрді жариялау үшін интерфейсті пайдаланудың артықшылығын біріктіреді. Джошуа Блохтың
«Java. Тиімді бағдарламалау» Java тіліндегі интерфейстер мен абстрактілі сыныптарды пайдалану тақырыбына арналған тамаша тараудан тұрады, оны жақсы түсіну үшін оны зерделеу мағынасы бар.
LinkedList
ArrayList
List
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ілі-бағытталған талдау және жобалау процесіндегі негізгі дизайн шешімдері болып табылады және икемді жүйені құрғыңыз келсе, әрине, сақтықпен пайдаланылуы керек.
GO TO FULL VERSION