Синфҳо ва интерфейсҳои абстрактӣ дар ҳама забонҳои барномасозии ба 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
он ҳама усулҳои умумиро амалӣ мекунад, татбиқи мушаххас (ба монанди
LinkedList
ва
ArrayList
) набояд ҳамаи усулҳоро татбиқ кунанд, чуноне ки агар онҳо интерфейсро
List
мустақиман амалӣ карда бошанд. Ин ҳалли манфиати истифодаи интерфейсро барои эълон кардани навъ бо чандирии синфи абстрактӣ барои татбиқи тамоми рафтори умумӣ дар як ҷо муттаҳид мекунад. Дар китоби Ҷошуа Блок
«Java. Барномасозии муассир » боби олӣ дар мавзӯи истифодаи интерфейсҳо ва синфҳои абстрактӣ дар Java дорад, барои беҳтар фаҳмидани он омӯзиши он маъно дорад.
3. Оё синфи абстрактӣ ниҳоӣ шуда метавонад?
Не, вай наметавонад. Калимаи калидӣ
final
маънои онро дорад, ки синф дар болои иерархия қарор дорад ва насл дошта наметавонад. Ва синфи абстрактӣ бе ворисон як аспи сферикӣ дар вакуум аст, зеро эҷод кардани мисол ғайриимкон аст
abstract class
. Ҳамин тариқ, агар синф ҳам
abstract
ва ҳам бошад
final
, пас он насл надорад ва наметавонад эҷод карда шавад. Компилятори Java хато мекунад, агар шумо синф
abstract
ва
final
.
4. Оё синфи абстрактӣ дар Java методҳои статикӣ дошта метавонад?
Бале, синфҳои абстрактӣ метавонанд усулҳои статикиро эълон ва муайян кунанд. Фақат ба принсипҳои умумии эҷоди усулҳои статикӣ дар Java риоя кардан лозим аст, зеро онҳо дар тарҳрезии ба an object нигаронидашуда номатлубанд, зеро бартарӣ додани усулҳои статикӣ дар Java имконнопазир аст. Усулҳои статикӣ дар синфи абстрактӣ хеле каманд, аммо агар сабабҳои хубе вуҷуд дошта бошанд, ҳеҷ чиз шуморо аз истифодаи онҳо бозмедорад.
5. Оё мумкин аст, ки синфи абстрактиро эҷод кард?
Не, шумо ин корро карда наметавонед. Мохияти синфи абстрактй дар он аст, ки он мукаммал нест ва бояд дар синфхои насли худ пурра карда шавад. Яъне ин синф ба истифода омода нест. Масалан, он метавонад татбиқи баъзе усулҳоро надошта бошад. Азбаски синф барои истифода омода нест, an objectи онро сохтан мумкин нест. Аммо шумо метавонед мисолҳои ворисони синфи абстрактӣ эҷод кунед. Компилятори Java хато мекунад, агар барнома кӯшиш кунад, ки синфи абстрактиро эҷод кунад.
6. Оё барои синфи абстрактӣ усулҳои абстрактӣ зарур аст?
Не, синфи абстрактӣ метавонад ягон усули абстрактӣ надошта бошад. Шумо метавонед реферати синфро дар Java танҳо бо истифода аз калимаи калидӣ
abstract
дар эъломияи он созед. Компилятор ҳама гуна маҳдудиятҳои сохториро амалӣ хоҳад кард, ба монанди имкон намедиҳад, ки намунаҳои ин синф эҷод карда шаванд. Дар омади гап, саволе, ки оё дар синф ё интерфейси абстрактӣ бояд усулҳои абстрактӣ вуҷуд дошта бошанд, баҳсбарангез аст. Ба назари ман, синфи абстрактӣ бояд усулҳои абстрактӣ дошта бошад, зеро ин аввалин чизест, ки барномасоз ҳангоми дидани синфи абстрактӣ дар бораи он фикр мекунад. Ин ба принсипи кам кардани ногаҳонӣ мувофиқат мекунад.
7. Фарқи байни синфи абстрактӣ ва интерфейс дар Java чӣ гуна аст?
Ин муҳимтарин ва яке аз классиктарин саволҳои мусоҳибаи Java мебошад. Ман ҳисоб карда наметавонам, ки ман ин саволро дар мусоҳибаҳои Java дар ҳама сатҳҳо чанд маротиба дидаам. Он чизе, ки ин саволро ҷолиб мегардонад, аз ҷумла, имкони довталаб барои мисол овардан аст. Ҷавоб додан ба саволҳо дар бораи асосҳои барномасозии ба an object нигаронидашуда, аз қабor абстраксия, инкапсуляция, полиморфизм ва мерос, осон аст, аммо вақте сухан дар бораи чунин нозукиҳои нозук меравад, довталабони кор аксар вақт ошуфта мешаванд ва аввалин чизеро, ки ба хотир меоянд, мегӯянд.
Ҷавоб ба ин савол сазовори мақолаи алоҳида аст (хусусан пас аз тағирот дар Java 8), аммо, кӯтоҳ:
- Интерфейс танҳо рафтори (усулҳои) an objectро тавсиф мекунад, аммо он ҳолат (майдонҳо) надорад (ба истиснои
public static final
), дар ҳоле ки синфи абстрактӣ метавонад онҳоро дошта бошад.
- Синфи абстрактӣ мерос гирифта мешавад (васеъ мешавад) ва интерфейс амалӣ карда мешавад (амалӣ мекунад). Мо метавонем танҳо як синфро мерос гирем, аммо ба қадри имкон интерфейсҳои зиёдеро татбиқ кунем. Интерфейс метавонад интерфейси/интерфейсҳои дигарро васеъ (васеъ) кунад.
- Синфҳои абстрактӣ дар ҳолате истифода мешаванд, ки муносибати "аст-a" вуҷуд дорад, яъне зерсинф синфи абстрактии асосиро васеъ мекунад ва интерфейсҳоро синфҳои гуногуне амалӣ карда метавонанд, ки ба ҳамдигар тамоман алоқаманд нестанд.
8. Кай барои бартарият додани синфи абстрактӣ ба интерфейс ва баръакс маъно дорад?
Ин идомаи саволҳои қаблӣ оид ба синфҳои абстрактӣ ва интерфейсҳо мебошад. Агар шумо донед, ки фарқиятҳои синтаксисии онҳо чӣ гунаанд, пас ҷавоб додан ба ин савол ба шумо мушкилот намеорад, зеро онҳо омor муайянкунандаи қабули қарор мебошанд. Азбаски илова кардани усули нав ба интерфейси нашршуда қариб ғайриимкон аст, беҳтар аст, ки синфи абстрактӣ дар ҳолати зарурати рушди минбаъда истифода шавад. Таҳияи синфҳои абстрактӣ дар Java назар ба таҳияи интерфейсҳо осонтар аст. Ба ҳамин монанд, агар интерфейс усулҳои аз ҳад зиёд дошта бошад ва татбиқи ҳамаи онҳо як дарди сар гардад, беҳтар аст барои татбиқи пешфарз синфи абстрактӣ эҷод кунед. Ин намуна дар бастаи коллексияи Java риоя карда мешавад, синфи абстрактӣ
AbstractList
татбиқи пешфарзро барои
List
.
Синфҳои абстрактиро истифода баред, агар:
- Шумо мехоҳед codeро дар байни якчанд синфҳои ба ҳам наздик мубодила кунед.
- Шумо интизоред, ки синфҳое, ки синфи абстрактии шуморо васеъ мекунанд, дорои усулҳо ё майдонҳои умумӣ доранд ё тағирдиҳандаҳои дастрасиро ғайр аз
public
(масалан, protected
ва private
) талаб мекунанд.
- Шумо мехоҳед майдонҳои ғайристатикӣ ё
не-final
майдонҳоро эълон кунед. Ин ба шумо имкон медиҳад, ки усулҳоеро муайян кунед, ки метавонанд ба ҳолати an objectе, ки ба онҳо тааллуқ доранд, дастрасӣ ва тағир диҳед.
Интерфейсҳоро истифода баред, агар:
- Шумо интизоред, ки синфҳои ба ҳам алоқаманд интерфейси шуморо амалӣ кунанд. Масалан, интерфейсҳо
Comparable
ва Cloneable
аз ҷониби бисёр синфҳои ба ҳам алоқаманд амалӣ карда мешаванд.
- Шумо мехоҳед рафтори як навъи маълумотро муайян кунед, аммо ба шумо парвое нест, ки онро кӣ амалӣ мекунад.
- Шумо мехоҳед мероси гуногунро истифода баред.
9. Усули абстрактӣ дар Java кадом аст?
Усули абстрактӣ усули бе бадан аст. Шумо танҳо як усулро бидуни муайян кардани он, бо истифода аз калимаи калидӣ
abstract
дар эъломияи усул эълон мекунед. Ҳама усулҳои дар дохor интерфейс бо забони Java эълоншуда ба таври нобаёнӣ абстрактӣ мебошанд. Ин аст як мисоли усули абстрактӣ дар Java:
public void abstract printVersion();
Ҳоло, барои татбиқи ин усул, шумо бояд синфи абстрактиро васеъ кунед ва ин усулро бекор кунед.
10. Оё синфи абстрактӣ дар Java метод дошта метавонад main
?
Бале, синфи абстрактӣ дар Java метавонад методро дар бар гирад
main
, зеро он танҳо усули дигари статикӣ аст ва синфи абстрактӣ метавонад бо истифода аз метод иҷро шавад
main
, ба шарте ки шумо онро эҷод накунед. Ин ҳама чизест, ки ман ба шумо гуфтан мехостам. Ва дар хотир доред: синфҳои абстрактӣ ва интерфейсҳо қарорҳои асосии тарҳрезӣ дар раванди таҳлил ва тарҳрезии ба an object нигаронидашуда мебошанд ва бояд бо эҳтиёт истифода шаванд, албатта, агар шумо хоҳед, ки системаи чандир эҷод кунед.
GO TO FULL VERSION