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

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

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

29. Конструкторда қайтаруды қолдануға болады ма?

Сіз жасай аласыз, бірақ қайтару мәнін қайтарудың оң жағындасыз . Яғни, сіз қайтаруды пайдалана аласыз; әрі қарай codeты орындауды шұғыл аяқтау (үзу) және an objectіні инициализациялауды аяқтау үшін конструктордағы есептеулер кезінде қосалқы құрылыс ретінде. Мысалы, бізде Cat класы бар және егер мысық үйсіз болса - isHomeless = true , біз инициализацияны аяқтап, басқа өрістерді толтырмауымыз керек (ақыр соңында, олар бізге белгісіз, өйткені мысық үйсіз):
public Cat(int age, String name, boolean isHomeless) {
   if (isHomeless){
       this.isHomeless = isHomeless;
       return;
   }
   this.isHomeless = isHomeless;
   this.age = age;
   this.name = name;
}
Бірақ нақты мәндерге келетін болсақ, конструктор мәнді қайтару үшін return пайдалана алмайды, себебі:
  • конструкторды жариялағанда сізде қайтару түріне ұқсас ештеңе болмайды;
  • Әдетте конструктор дананы құру кезінде жасырын түрде шақырылады;
  • Конструктор әдіс емес: бұл жалғыз мақсаты даналық айнымалыларды инициализациялау болып табылатын жеке механизм және жаңа оператор нысанды жасауға жауап береді .
Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  4 - 2 бөлім

30. Конструктордан ерекше жағдайды шығаруға болады ма?

Конструкторлар ерекше жағдайларды әдістер сияқты дәл солай шешеді. Ал егер әдістер әдіс тақырыбына <ExceptionType> throws жазу арқылы ерекше жағдайларды шығаруға мүмкіндік берсе , онда конструктор бізге мұны істеуге мүмкіндік береді, сонымен қатар мұрагер конструкторды мұраға алу және анықтау кезінде біз ерекше жағдай түрін кеңейте аламыз. Мысалы, IOException -> Ерекшелік (бірақ керісінше емес). Конструктор арқылы ерекше жағдайды шығаруға мысал ретінде Cat сыныбын алайық . Оны жасау кезінде консольден атау мен жасты енгізгіміз келеді делік:
public Cat() throws IOException {
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   this.name = reader.readLine();
   this.age = Integer.parseInt(reader.readLine());
}
reader.readLine() IOException шығаратындықтан , біз оны тақырыпта ықтимал шығарылған ерекшелік ретінде көрсетеміз.

31. Класс тақырыбы қандай элементтерден тұрады? Мысал жаз

Класс тақырыбын құрайтын элементтер туралы айтатын болсақ, шағын диаграмманы қарастырайық:
  • міндетті компоненттер жақшада <> болады
  • қосымша - {} ішінде
{сыныпқа кіру модификаторы}сыныптың тұрақтылығы}сыныптың аяқталуы}сыныптың абстракциясы} <сынып атауы>{ата-аналық сыныптан мұра} {интерфейсті іске асыру} Сонымен, бізде не бар: {class access modifier} - тек жалпы модификаторлар мен жетіспейтін қатынас модификаторы, яғни әдепкі сынып үшін қол жетімді . {class static} - static - бұл класстың статикалық екенін көрсететін модификатор, тек ішкі сыныптарға (басқа сыныптар ішіндегі сыныптар) қатысты. {class finality} - есімізде, бұл соңғы модификатор , оның қатысуымен класс мұраланbyteын болады (қораптағы мысал - String ). {сынып абстракциясы} - модификатор - абстракт , бұл класста орындалмаған әдістер болуы мүмкін екенін көрсетеді. Бұл модификатор соңғы модификатормен қайшы келеді , яғни олардың тек біреуі ғана класс тақырыбында болуы мүмкін, өйткені абстрактілі модификатор берілген класс мұраға алынатынын және оның дерексіз бөліктерінің орындалатынын білдіреді. Ал финал бұл сыныптың соңғы (соңғы) нұсқасы екенін және оны мұраға алуға болмайтынын көрсетеді. Шын мәнінде, екі модификаторды бір уақытта пайдалану абсурд болар еді, ал компилятор бізге мұны істеуге мүмкіндік бермейді. <сынып> - сынып декларациясын көрсететін қажетті кілт сөз. <сынып атауы> - қарапайым класс атауы, ол нақты Java класының идентификаторы болып табылады. Толық жарамды сынып атауы толық жарамды бума атауынан тұрады + . + қарапайым сынып атауы. {Heritance from Parent class} - extensions кілт сөзі арқылы ата-аналық сыныпты (бар болса) көрсету . Мысалы, .. ParentClass кеңейтеді . {интерфейсті жүзеге асыру} - bu класс жүзеге асыратын интерфейстерді (бар болса) implements кілт сөзі арқылы көрсету . Мысалы: ... FirstInterface, SecondInterface іске асырады ... Класс тақырыбының мысалы ретінде Cat жүйесінен мұра болып табылатын және WildAnimal интерфейсін жүзеге асыратын Lion сыныбының тақырыбын қарастырайық :
public final class Lion extends Cat implements WildAnimal
Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  4 - 3 бөлім

32. Әдіс тақырыбы қандай элементтерден тұрады? Мысал жаз

Тағы да, әдіс тақырыбын құрайтын элементтерді қараған кезде, шағын диаграмманы қарастырыңыз, мұнда:
  • міндетті компоненттер жақшада <>
  • қосымша - {} ішінде
{қолжетімділік модификаторы}{method static}әдіс абстракциясы}әдістің соңғылығы}синхрондау модификаторы} {түпнұсқа түрлендіргіш}қайтарылатын мән><әдіс атауы> <(> {әдіс аргументтері} <)>{қабылданған ерекшеліктер} {қолжетімділік модификаторы } — барлық қатынас модификаторлары әдіс үшін қолжетімді: public , protected , default , private . {method static} - static - бұл әдістің статикалық екенін көрсететін модификатор, яғни ол an objectке емес, классқа байланысты. {әдістің абстракциясы} - дерексіз модификатор , ол әдістің іске асырылуының (денесінің) жоқтығын көрсетеді. Дұрыс жұмыс істеу үшін әдіс берілген класс үшін дерексіз модификатор қажет . Класс тақырыбындағыдай, бұл модификатор соңғы модификатормен қайшы келеді , бірақ оған қосымша, ол статикалық модификатормен де қайшы келеді , себебі абстрактілі әдіс ұрпақтағы әдісті қайта анықтауды білдіреді, ал статикалық әдістер жоққа шығарылмайды. {әдістің ақырғылығы} - қорытынды - бұл әдісті қайта анықтауға болмайтынын көрсететін модификатор. {синхрондау модификаторы} - ​​синхрондалған - бұл әдіс әртүрлі ағындардан оған бір уақытта қол жеткізуден қорғалғанын білдіретін модификатор. Егер әдіс статикалық болмаса, ол нысанның осы мутексінде жабылады. Егер әдіс статикалық болса, ол ағымдағы сыныптың мутексінде жабылады. {native модификатор} - жергілікті - бұл модификатор әдіс басқа бағдарламалау тілінде жазылғанын көрсетеді. <қайтаратын мән> - әдіс қайтаруға тиіс мән түрі. Егер ол ештеңе қайтармаса, void . <әдіс атауы> - әдістің аты, оның жүйедегі идентификаторы. {әдіс аргументтері} - әдіс қабылдайтын аргументтер (параметрлер): олар оның функционалдығын жүзеге асыру үшін қажет. {throwable exceptions} - throwsExceptionType - бұл әдіс шығара алатын тексерілген ерекшеліктердің тізімі. Әдіс тақырыбының мысалы ретінде мен мынаны беремін:
public static void main(String[] args) throws IOException

33. Егер ол негізгі нысанда анықталмаса (бірақ басқа конструктор анықталған) ұрпақ нысанында әдепкі конструкторды жасаңыз.

Мен сұрақтың өзін толық түсінбеймін, бірақ бұл, мысалы , ата-анада бізде пайдаланушы конструкторы бар екенін білдіреді:
public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
Сондықтан, ата-баба сыныбында біз ата-аналық конструкторды толтыратын (шақыратын) конструкторды анықтауымыз керек:
public  class Lion extends Cat {

   public Lion(int age, String name) {
       super(age, name);
   }
}
Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  4 - 4 бөлім

34. this түйінді сөзі қай кезде қолданылады?

Java тілінде бұл екі түрлі мағынаға ие. 1. Ағымдағы нысанға сілтеме ретінде this.age = 9 . Яғни, бұл ол шақырылған нысанға және оны қолданатын codeқа сілтеме жасайды . Негізгі функция - codeты оқу мүмкіндігін арттыру және түсініксіздікті болдырмау. Мысалы, ішкі сынып өрісінің аты мен әдіс аргументі бірдей болса:
public void setName(String name) {
   this.name = name;
}
Яғни, this.name – нысан атауының өрісі әдіс аргументі.Бұл сілтемені статикалық әдістерде пайдалану мүмкін емес. 2. this (value) сияқты әдісті шақыру түрінде конструкторда қолдануға болады . Бұл жағдайда ол сол кластағы басқа конструкторға шақыру болады. Қысқаша айтқанда, an object құру кезінде бірден екі конструкторды шақыруға болады:
public Cat(int age, String name) {
   this(name);
   this.age = age;
}

public Cat(String name) {
   this.name = name;
}
Cat нысаны жасалғанда және бірінші конструктор шақырылғанда, нысанның екі өрісі де шақырылады және сәтті инициализацияланады. Бірнеше нюанстар бар:
  1. this() тек конструкторда жұмыс істейді.
  2. Басқа конструкторға сілтеме конструктор блогының (денесінің) бірінші жолында болуы керек. Сондықтан бір конструкторда берілген класстың бірнеше (басқа) конструкторын шақыруға болмайды.
Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  4 - 5 бөлімҚосымша мысалдар осы мақалада .

35. Инициализатор дегеніміз не?

Менің түсінуімше, бұл сұрақта біз қарапайым және статистикалық инициализация блоктары туралы айтып отырмыз. Алдымен, инициализацияның не екенін еске түсірейік. Инициализация – құру, іске қосу, жұмысқа дайындау, параметрлерді анықтау. Бағдарламаны немесе компонентті пайдалануға дайын күйге келтіру. Естеріңізде болса, нысанды жасау кезінде сынып айнымалысы мәлімдемеден кейін тікелей инициализациялануы мүмкін:
class Cat {
   private int age = 9;
   private  String name = "Tom";
Немесе оны конструктор арқылы сырттан орнатыңыз:
class Cat {
   private int age;
   private  String name;

   public Cat(int age, String name) {
       this.age = age;
       this.name = name;
   }
Бірақ тағы бір жолы бар: инициализация блогы арқылы ішкі нысан айнымалы мәнін орнату, ол класс ішіндегі бұйра жақшаға ұқсайтын { } атауы жоқ (әдіс немесе конструктор сияқты):
class Cat {
   private int age;
   private  String name;

   {
       age = 10;
       name = "Tom";
   }
Яғни, инициализация блогы an object жасалған кезде жүктелетін code бөлігі болып табылады. Әдетте, мұндай блоктар сыныпты жүктеу кезінде қажет болатын кейбір күрделі есептеулерді орындау үшін қолданылады. Бұл есептеулердің нәтижелері айнымалылар үшін мәндер ретінде көрсетілуі мүмкін. Сондай-ақ, әдеттегі инициализация блоктарынан басқа, бірдей көрінетін, бірақ бұйра жақша алдында static кілт сөзі бар статикалық блоктар бар :
class Cat {
   private static int age;
   private static String name;

   static{
       age = 10;
       name = "Tom";
   }
Бұл блок алдыңғы блокпен бірдей. Бірақ егер әрбір нысан инициализацияланған кезде кәдімгі біреуі іске қосылса, статикалық бір рет сынып жүктелген кезде ғана іске қосылады. Мұндай блокта, әдетте, статикалық класс айнымалыларының кейінгі инициализациясы үшін де кейбір күрделі есептеулер орындалады. Дәл осындай шектеулер статикалық блокқа статикалық әдістерге қатысты қолданылады: ол статикалық емес деректерді, сондай-ақ ағымдағы нысанға сілтемені пайдалана алмайды - this . Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  4-6 бөлімӘрі қарай, инициализация блоктары іске қосылған сәтті жақсы түсіну үшін классты (оның ата-тегімен бірге) инициализациялау тәртібін көре аламыз.

36. Сыныптың жалпы сыныбын мұраға алу үшін Child extensions Parent, нысанды инициализациялау ретін жазыңыз.

Child сыныбы жүктелген кезде, инициализация реті келесідей болады:
  1. Ата-ана класының статикалық өрістері .
  2. Ата-ана класы үшін статикалық инициализация блогы .
  3. Child класының статикалық өрістері .
  4. Child сыныбына арналған статикалық инициализация блогы .
  5. Ата-ана класының статикалық емес өрістері .
  6. Ата-ана класы үшін статикалық инициализация блогы емес .
  7. Ата-ана сыныбына арналған конструктор .
  8. Child сыныбының статикалық емес өрістері .
  9. Child сыныбы үшін статикалық инициализация блогы емес .
  10. Балалар сыныбының конструкторы .
Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  4 - 7 бөлімМұнда инициализация тәртібін іс жүзінде түсіндіретін қысқаша мақала берілген.

37. Класстар (an objectілер) арасындағы қандай қатынастарды білесіз?

Java тілінде сыныптар арасындағы қатынастың екі түрі бар:
  • IS- қарым-қатынас
OOP-тағы IS-A принципі класс мұрагерлігіне немесе интерфейсті іске асыруға негізделген. Мысалы, Lion класы Cat класынан мұрагер болса, Lion Cat деп айтамыз :
Lion IS-A Cat
(бірақ әрбір мысық арыстан емес ) Интерфейстерде жағдай дәл солай. Егер Lion класы WildAnimal интерфейсін жүзеге асырса , онда олар да қатынаста болады:
Lion IS-A WildAnimal
  • HAS-A қатынастары
Қарым-қатынастың бұл түрі «ассоциация» деп те аталатын басқа сыныптардың сыныптарды пайдалануына негізделген. Ассоциация - бұл басқа сыныпқа (немесе тіпті бір-біріне) сілтеме жасайтын бір сынып. Мысалы, Car класы Passenger сыныбына сілтеме жасай алады және бұл қатынас:
Car HAS-A Passenger
Және керісінше: егер Жолаушыда Car сілтемесі болса , онда бұл қатынас болады:
Passenger HAS-A Car

38. Заттар арасындағы қандай ассоциативті байланыстарды білесіз?

Агрегация мен құрам – бұл ассоциацияның ерекше жағдайларынан басқа ештеңе емес. Агрегация – бір an object басқа an objectінің бөлігі болатын қатынас. Мысалы, жолаушы көлікте болуы мүмкін. Сондай-ақ, бірнеше жолаушы болуы мүмкін немесе мүлдем болмауы мүмкін (егер біз Tesla туралы айтатын болсақ, онда жүргізуші қажет емес). Мысалы:
public class Car {
   private List passengers = new ArrayList<>();

 void setPassenger(Passenger passenger) {
     passengers.add(passenger);
 }

   void move() {
       for (Passenger passenger : passengers) {
           System.out.println("Перевозка пассажира - " + passenger.toString());
       }
       passengers.clear();
   }
}
Яғни, бізге жолаушылардың саны (немесе олардың бар-жоғы) маңызды емес: Car класының функционалдығы бұған байланысты емес. Агрегация сонымен қатар нысанды басқа нысан пайдаланған кезде, біріншісі басқа нысандарда қолданылуы мүмкін екенін білдіреді. Мысалы, бір студент тоқыма үйірмесіне де, рокерлердің музыкалық тобына да мүше бола алады және сонымен бірге ағылшын тілін үйренушілер тобына бара алады. Өздеріңіз түсінгеніңіздей, біріктіру - бұл сыныптар арасындағы неғұрлым еркін ассоциациялық қатынас. Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  4-8 бөлімКомпозиция - бұл an object тек басқа an objectінің бөлігі ғана емес, басқа an objectінің жұмысы біріншіге өте тәуелді болған кезде одан да қатаң қатынас. Мысалы, автомобиль қозғалтқышы. Қозғалтқыш машинасыз болуы мүмкін болса да, оның сыртында пайдасыз. Автокөлік қозғалтқышсыз жұмыс істей алмайды:
public class Car {
   private Engine engine;

   public Car(Engine engine) {
       this.engine = engine;
   }

   void startMoving() {
       engine.start();
           ...
   }
Композиция сонымен қатар нысанды басқа an object пайдаланған кезде, біріншісі басқа біреуге тиесілі болмайтынын білдіреді. Біздің мысалға оралатын болсақ, қозғалтқыш бір ғана автомобильге тиесілі болуы мүмкін, бірақ бір уақытта екі немесе одан да көп емес. Бүгін осында тоқтайтын шығармыз.Java әзірлеушісіне арналған сұхбаттардағы сұрақтар мен жауаптарды талдау.  4 - 9 бөлім
Сериядағы басқа материалдар:
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION