JavaRush /Java блогы /Random-KK /Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жа...
Константин
Деңгей

Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау. 5-бөлім

Топта жарияланған
Сәлем Сәлем! Бүгінгі таңда Java әзірлеушілері жоғары сұранысқа ие. Әрине, мен сізге бос орын бере алмаймын, бірақ мен сізге аздап көмектесуге тырысамын, сонда сіз жаңа білім алып, кейбір олқылықтарыңызды толтырасыз. Сондықтан біз Java әзірлеушісіне арналған 250+ сұхбат сұрақтарын талдауды жалғастырамыз . Талдаудың алдыңғы бөліктеріне сілтемелер мақаланың соңында.Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  5 - 1 бөлім

39. Java тіліндегі қатынас модификаторлары дегеніміз не? Оларды атаңыз. Олар не үшін пайдаланылады?

Мен Java инкапсуляция элементтері туралы сұрақта рұқсат модификаторларын бұрын сипаттаған болатынмын. Бірақ бәрібір еске саламын. Java тіліндегі қатынас модификаторлары белгілі бір Java құрамдас бөлігіне берілген рұқсат деңгейін сипаттайтын кілт сөздер болып табылады. Қол жеткізу модификаторлары болуы мүмкін:
  • public — осы модификаторы бар элемент жалпыға қолжетімді болады. Анау. өрістер мен әдістер, жалпы модификатормен жарияланған сыныптар ағымдағы бумадан да, сыртқы бумалардан да басқа сыныптарға көрінеді;
  • қорғалған - осы модификаторы бар элемент ағымдағы буманың ағымдағы класының кез келген жерінен немесе олар басқа бумаларда болса да, ұрпақ сыныптарында қолжетімді болады;
  • әдепкі , немесе жоқ модификатор - бұл модификатор рұқсат модификаторы мүлде көрсетілмегенде жасырын түрде пайдаланылады. Бұл алдыңғыға ұқсас, тек басқа пакеттердегі ұрпақ сыныптарында көрінуге рұқсат етілген;
  • private барлық модификаторлардың ішіндегі ең жеке болып табылады, ол элементке тек ағымдағы сынып ішінде қол жеткізуге мүмкіндік береді.
Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  5-2 бөлім

40. Статикалық және айнымалы әдістердің негізгі ерекшелігін атаңыз

Өте оғаш тұжырым - «айнымалы әдістер». Әрине, бұл қарапайым, статикалық емес әдістерге қатысты. Сонымен, негізгі айырмашылық статикалық әдістер класқа жатады және шын мәнінде олар үшін бұл класс данасын жасаудың қажеті жоқ: оны тек класс түрі арқылы шақыруға болады. Мысалы, бізде мысықты еркелетудің статикалық әдісі бар:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
Оны шақыру үшін бізге CatService класының данасы қажет емес :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
Қарапайым әдістер an objectіге байланысты (тиісті) болған кезде және оларды шақыру үшін сізде әдіс шақырылатын данаға (an objectіге) ие болуы керек. Мысалы, мысықтың статикалық емес әдісі бар - мияулау:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
Бұл әдісті шақыру үшін бізге мысықтың нақты данасы қажет:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. Статикалық және «айнымалы» әдістердің негізгі шектеулері қандай?

Жоғарыда айтқанымдай, әдеттегі әдістің негізгі шектеуі әрқашан әдіс шақырылатын кейбір дананың болуы керек. Бірақ статикалық әдіс мұны талап етпейді, бірақ ол осы сілтемеге – ағымдағы нысанның элементтеріне сілтеме жасай алмайды, өйткені ол үшін ағымдағы нысан жоқ.

42. Статикалық түйінді сөз нені білдіреді? Статикалық әдісті қайта анықтауға немесе шамадан тыс жүктеуге болады ма?

static кілт сөзімен тағайындалған элемент сыныптың an objectісіне емес, сыныпқа жатады және ол сыныптың өзі жүктелген кезде жүктеледі. Статикалық элементтер бүкіл бағдарлама үшін жалғыз, ал тұрақты элементтер белгілі бір an object үшін жалғыз. Статикалық болуы мүмкін:
  • класс өрістері;
  • классты инициализациялау блогы;
  • сынып әдісі;
  • сыныптың ішкі сыныптары (бірақ бұл әлі де тавтология).
Статикалық әдісті қайта анықтау мүмкін емес: ол сыныпқа жатады және мұраланбайды, бірақ сонымен бірге ол шамадан тыс жүктелуі мүмкін.

43. Әдіс бір уақытта статикалық және абстрактілі бола ала ма?

Мен бұл туралы алдыңғы мақалада айттым: әдіс бір уақытта абстрактілі және статикалық бола алмайды. Әдістің абстрактілілігі оның мұрагерде қайта белгіленуі керек екенін білдіреді. Сонымен қатар, статикалық әдіс сыныпқа жатады және оны жоққа шығару мүмкін емес: бұл қайшылықты тудырады, оны компилятор көреді және қарғыс айта бастайды. Егер сізде мұндай жағдай болса, сіз өзіңіздің қолданбаңыздың архитектурасының дұрыстығы туралы мұқият ойлануыңыз керек (ақыр соңында, онда бірдеңе дұрыс емес).Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  5 - 3 бөлім

44. Тұрақты әдістердің ортасында статикалық әдістерді қолдануға болады ма? Қарама-қарсы? Неліктен?

Тұрақты әдістерде статикалық әдістерді қолдануға болады, өйткені бұған ештеңе кедергі келтірмейді. Бұл ретте кері жағдай мүмкін емес: статикалық әдіс осы сыныптың нақты данасына сілтемесіз қалыпты әдісті пайдалана алмайды. Естеріңізде болса, бұл сілтеме статикалық сынып мүшелері үшін қол жетімді емес: сыныптың көптеген нақты нысандары қалағаныңызша болуы мүмкін және олардың әрқайсысында өзіне сілтеме болады - this . Осы сілтеменің қайсысын алу керектігін қалай түсінесіз ? Бірақ амал жоқ. Сондықтан статикалық элементтер нақты нысанға сілтемесіз статикалық емес элементтерге сілтеме жасай алмайды. Шындығында, статикалық әдіс статикалық емес әдісті, егер оның нақты нысанға сілтемесі болса ғана пайдалана алады. Мысалы, дәлел ретінде келген:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
Мұнда біз petTheCat статикалық әдісі Cat нысанының қалыпты, статикалық емес әдісін шақыратынын көреміз - getName .

45. Интерфейс дегеніміз не? Соңғы интерфейс болуы мүмкін бе?

Біздің есімізде, Java-да көп мұра жоқ. Интерфейстер оған балама болып табылады. Интерфейс өте жойылған сыныпқа ұқсайды. Олар осы интерфейстерді жүзеге асыратын (іске асыратын) сыныптармен жүзеге асырылатын нақты іске асырусыз функционалдылықты анықтайды. Интерфейс мысалы:
public interface Animal {
    void voice();
}
Класс интерфейсін іске асырудың мысалы:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Интерфейстерді пайдалану туралы білуіңіз керек негізгі нәрсе:
  1. Интерфейс әдістері нақты әдіс денесінсіз тек тақырыпты қамтуы керек, яғни. дерексіз болуы керек (бірақ абстрактілі кілт сөзін қолданбай ). Бұған ерекшелік - әдіс денесін қажет ететін статикалық және әдепкі әдістер.
  2. Класс үтірмен бөлінген көптеген интерфейстерді (айтқанымдай, бұл бірнеше мұраға балама) жүзеге асыра алады: Lion класы Animal, Wild қолданбаларын жүзеге асырады .
  3. Интерфейстер - интерфейс кілт сөзінің көмегімен құрылады .
  4. Класс интерфейсін жүзеге асырған кезде, кілт сөзі жүзеге асырылады .
  5. Белгілі бір интерфейсті жүзеге асыратын класс оның барлық дерексіз әдістерін жүзеге асыруы керек немесе өзін абстрактілі деп жариялауы керек.
  6. Интерфейстерді қолданудың негізгі мақсаты – полиморфизмді (an objectілердің көптеген формаларды қабылдау мүмкіндігі) жүзеге асыру.
  7. Әдетте, әдістерге қатынасу модификаторлары интерфейсте жазылмайды: олар әдепкі бойынша жалпыға ортақ болып табылады және жалпыдан басқа модификаторларды көрсету мүмкін емес. Java 9 нұсқасынан бастап әдістер үшін жеке модификаторларды пайдалануға болады .
  8. Интерфейс айнымалылары әдепкі бойынша статикалық соңғы болып табылады , басқаша айтқанда, тұрақтылар: олар әрқашан интерфейсте тікелей инициализациялануы керек.
  9. Сіз интерфейс нысанын жасай алмайсыз.
Интерфейстердің түпкілікті болуы мүмкін бе деген сұраққа жауап, әрине, жоқ. Өйткені, интерфейстердің мәні жүзеге асырылуы керек. Және бәріміз жақсы есте ұстағанымыздай, сынып деңгейіндегі финал оны мұрагерлік емес етеді, ал интерфейс жағдайында іске асырылмайтын етеді. Неліктен бізге іске асырылмайтын және пайдаланылмайтын интерфейс қажет? Бұл дұрыс - қажет емес! Компилятор солай ойлайды)) Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  5 - 4 бөлімМағына Java 8 интерфейсінде статикалық әдістерді енгізумен ғана пайда болды, бірақ бұл интерфейстің түпкілікті болуы мүмкін еместігін өзгертпеді. Мен интерфейстер туралы өте үстірт айттым, өйткені... бұл кең тақырып. Бұл туралы толығырақ Java тіліндегі интерфейстер және дерексіз сыныптар мен интерфейстер арасындағы айырмашылықтар туралы мақалалардан оқыңыз .

46. ​​Статикалық өрістерді қай жерде инициализациялауға болады?

Статикалық өрістерді инициализациялауға болады:
  • тікелей декларация бойынша, тең белгісі арқылы = ;
  • статикалық инициализация блогында;
  • статикалық емес инициализация блогында, бірақ сіз an object жасаған сайын бұл өріс осы баптандыру блогымен қайта жазылатынын түсінуіңіз керек;
  • сынып конструкторында. Бұл конструктор шақырылған сайын (яғни an object осы конструктор арқылы жасалғанда) бұл өріс қайта жазылады;
  • статикалық әдістерде;
  • статикалық емес әдістерде;
  • ішкі статикалық және статикалық емес, жергілікті және анонимді сыныптарда.

47. Анонимдік кластар дегеніміз не?

Анонимдік сыныптар – өзіндік типі жоқ сыныптар. Мен не туралы айтып отырмын? Интерфейстер туралы айтқан кезде мен интерфейс an objectісін жасай алмайтыныңызды айттым: интерфейсті жүзеге асыратын сыныптың an objectісін ғана жасауға болады. Сыныпта интерфейсті іске асырғыңыз келмесе, бірақ интерфейс түріндегі нысан қажет болса ше? Және, ең алдымен, бұл осы нысанды пайдаланудың жалғыз жағдайы болады. Және толыққанды іске асыру класын жасаудың қажеті жоқ. Мұны қалай істейсіз? Дұрыс! Анонимді сынып арқылы! Бізде AnimalJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  5 - 5 бөлім интерфейсі бар делік :
public final interface Animal {
   public void voice();
}
Егер біз бұл интерфейсті анонимді класс арқылы жасағымыз келсе:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
Ал содан кейін сіз осы нысанды және оның іске асырылған әдісін қауіпсіз пайдалана аласыз - дауыс . Яғни, анонимді класс осы интерфейсті және оның барлық дерексіз әдістерін дәл осы жерде және қазір жүзеге асырады. Әйтпесе, интерфейс/абстрактілі сынып an objectісін жасай алмаймыз, себебі орындалмаған/абстрактілі әдістер бар. Мен атап өткенімдей, анонимді класстар интерфейстің абстрактілі әдістерін жүзеге асыру үшін ғана емес, сонымен қатар абстрактілі класстың абстрактілі әдістерін жүзеге асыру үшін де қолданылады. Бұл тәсіл an object бір рет пайдаланылатын немесе әдістердің берілген іске асырылуы тек бір рет қажет болатын жағдайлар үшін жақсы және қажетті дерексіз классты/интерфейсті жүзеге асыратын жеке класс жасаудың қажеті жоқ. Бірақ мен анонимді сабақтарды пайдалану жұмыста сирек кездесетін жағдай екенін атап өткім келеді: әдетте, қарапайым сабақтарға артықшылық беріледі. Анонимді сабақтар туралы толығырақ осы мақалада оқи аласыз .

48. Қарапайым класстар дегеніміз не?

Маған келетін болсақ, бұл өте оғаш сұрақ және, мүмкін, бұл тұзақ сұрақ, өйткені Java-да қарабайыр сыныптар деген нәрсе жоқ: мүмкін, біз бұрын қарастырған қарабайыр типтер тұжырымдамасын қоспағанда. Біздің есімізде Java тілінде 8 қарабайыр тип бар - byte , қысқа , int , ұзын , float , double , char , логикалық .Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  5-6 бөлім

49. «Қаптама» класы дегеніміз не?

Java-да қарабайыр типтерді қолданудың негізгі мәселесі - олар әлі де сынып емес, ал Java әлі де OOP тілі болып табылады. Яғни, бұл тілде жазылған программалар an objectілер арасындағы өзара әрекеттестікке дейін қысқарады. Ал, примитивтер an object емес. Оларда әдістер жоқ, тіпті Object класындағы стандартты әдістер де жоқ . Картада кілт ретінде қарабайырды пайдалану қажет болса ше ? Содан кейін hashCode әдісін шақыру керек . Сондай-ақ, онда тең әдісті шақыруға болады . Сонда ше? Қарапайым емес, сынып болуы керек сәттер өте көп болуы мүмкін, бұл примитивтерді бағдарламада пайдаланылмайтын және қалаусыз элементтерге айналдырады, өйткені бұл OOP идеясын бұзады. Бірақ бәрі көрінгендей жаман емес. Өйткені, Java-да қарабайыр орауыш ұғымы бар. Әрбір қарабайыр типтің аналогтық класы бар:
  • byte -> Байт.сынып
  • қысқа -> Қысқа.сынып
  • int -> Integer.class
  • long -> Long.class
  • float -> Float.class
  • double -> Double.class
  • char -> Character.class
  • логикалық -> логикалық.сынып
Бұл қарапайым түрлердің көрінісі, бірақ әртүрлі және функционалды әдістердің жиынтығы бар толыққанды сыныптар түрінде. Бұл сыныптарды ыңғайлы пайдалану үшін автобокс және бокстан шығару ұғымдары енгізілді. Autoboxing - қажет болған жағдайда қарабайыр типті аналогтық классқа автоматты түрлендіру (мысалы, int -тан Integer ). Қораптан шығару алдыңғысының кері процесі: қарабайыр орауыш класын қарабайыр түрге автоматты түрде түрлендіру (мысалы, Integer to int ). Қарапайым орауыш сыныптарын және автобокс пен қораптан шығару процестерін енгізудің арқасында қарабайыр типтер OOP тілінің - Java-ның толыққанды мүшесі бола алды. Бұл тақырып туралы көбірек білу үшін мен осы мақаланыJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  5 - 7 бөлім оқуды ұсынамын .

50. Nested класс дегеніміз не? Ол қашан қолданылады?

Кірістірілген сынып - басқа сыныптың мүшесі болып табылатын ішкі сынып. Java тілінде мұндай ішкі класстардың 4 түрі бар: 1. Ішкі класс Бұл класс түрі тікелей басқа класстың денесінде жарияланған. Кірістірілген ішкі сынып кез келген жеке өріске немесе сыртқы сынып данасы әдісіне қол жеткізе алады. Мысал ретінде хайуанаттар бағын құрайық, онда бізде жануар - зебра болады:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Ештеңе күрделі емес, солай ма? Ішкі сынып an objectісін жасау мысалын қарастырайық:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
Көріп отырғаныңыздай, фрейминг класының an objectісін жасау өте қажет, оның сілтемесі негізінде ішкі класстың an objectісін жасауға болады. Сондай-ақ кірістірілген ішкі сыныпта статикалық әдістер немесе статикалық өрістер болмауы мүмкін екенін атап өткім келеді . Себебі ішкі класс өзінің сыртқы класының an objectісімен жасырын түрде байланысты және ол өз ішінде ешқандай статикалық әдістерді жариялай алмайды. 2. Статикалық кірістірілген сыныптар Бұл класс алдыңғыға ұқсас, тек оның класс декларациясының жанында статикалық қатынас модификаторы бар. Мұндай класс сыртқы сыныптың статикалық емес өрістеріне қол жеткізе алмайтындықтан, ол ішкі сыныпқа қарағанда сыртқы сыныптың статикалық бөлігіне көбірек ұқсайды. Бұл жағдайда сынып деректері сыртқы сыныптың барлық статикалық мүшелеріне, тіпті жекеге де қол жеткізе алады. Статикалық кірістірілген сыныптың мысалы:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Жасау әдісі алдыңғысынан сәл өзгеше:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
Мұнда кірістірілген статикалық класстың an objectісін жасау үшін бізге сыртқы сыныптың нысаны қажет емес. Сыртқы сыныптан бізге оның түрі ғана қажет, сонда біз кірістірілген класстың орнын таба аламыз. 3. Жергілікті сыныптар Жергілікті сыныптар әдіс денесінің ішінде жарияланған сыныптар болып табылады және жергілікті сыныптың нысанын жасау және пайдалану тек осы әдіс аясында мүмкін болады. Мысалы:
public class Zoo {
   public void toFeed(String animal, String food) {
       switch(animal){
           case "зебра":
               class Zebra {
                   void toFeedZebra(String food) {
                       System.out.println("Дать зебре - " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.toFeedZebra(food);
               ...
Қолдану мысалы:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
toFeed әдісінің codeын көрмесеңіз , сіз тіпті жергілікті сыныптың бар екеніне күдіктенбейсіз бе? Жергілікті класс статикалық немесе өтпелі болуы мүмкін емес, бірақ оны дерексіз немесе түпкілікті деп белгілеуге болады (тек НЕМЕСЕ, өйткені осы екі модификаторды пайдалану қақтығыс тудырады). 4. Анонимді сыныптар Біз жоғарыда анонимді сыныптар туралы айтқан болатынбыз және есіңізде болса, оларды екі көзден – интерфейстер мен класстардан жасауға болады. Ішкі статикалық және статикалық емес сыныптарды пайдалану себептері пайдаланылады, себебі кейде кішігірім сыныптарды үлкеніректердің ішіне ендіру және оларды бірге сақтау жақсы болады: осылайша олардың үйлесімділігі жоғары және ортақ мақсат болады. Іс жүзінде кірістірілген сыныптарды пайдалану code инкапсуляциясын арттырады. Жергілікті сыныптарды таңдаудың себебі, берілген класс тек бір әдіс шеңберінде пайдаланылуы мүмкін. Бұл жағдайда codeты бүкіл қолданбаға тарату қажет пе? Жоқ. Бірақ сонымен бірге мен өз тәжірибемде жергілікті сабақтарды пайдалануды ешқашан көрмегенімді қосамын, өйткені олардың қажеттілігі өте даулы. Анонимді сыныптарды пайдаланудың себебі интерфейсті немесе абстрактілі классты нақты іске асыру тек бір рет қажет болуы мүмкін, сондықтан бұл үшін іске асырылуы бар жеке, толыққанды класс жасаудың қажеті жоқ. Оның орнына, қарапайым түрде біз анонимді сынып арқылы қажетті әдісті(лерді) іске асырдық, бұл нысанды қолданып, ол туралы ұмытып кеттік (бұл туралы қоқыс жинаушы есте қалды). Бұл және осыJava әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  5 - 8 бөлім мақала сізге ішкі сабақтарды егжей-тегжейлі зерделеуге көмектеседі .

51. Класста қандай рұқсат модификаторлары болуы мүмкін?

Естеріңізде болса, сыныптардың әртүрлі түрлері бар және оларға әртүрлі қол жеткізу модификаторлары қолданылады:
  • сыртқы сыныпта қолжетімділік модификаторы ортақ болуы мүмкін немесе модификаторсыз (әдепкі модификатор) болуы мүмкін;
  • ішкі класс барлық 4 қатынас модификаторларын қолдайды;
  • кірістірілген статикалық класс қорғалғандан басқа барлық қатынас модификаторларына қолдау көрсетеді , себебі бұл модификатор класстың статикалық мүшесіне қайшы келетін мұраны білдіреді (статикалық элементтер мұраланбайды);
  • жергілікті сыныпта тек әдепкі модификатор болуы мүмкін (яғни, модификатор мүлде жоқ);
  • анонимді класс : егер сынып түрі туралы мәлімдеме болмаса, онда кіру модификаторлары мүлде болмайды.
Міне, біз бүгін тоқталамыз. Жуықта көріскенше!Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  5 - 9 бөлім
Сериядағы басқа материалдар:
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION