Барлығына сәлем, бүгін мен Java әзірлеушісіне арналған 250+ сұхбат сұрақтарын талдауды жалғастырамын . Талдаудың алдыңғы бөліктері: бірінші , екінші , үшінші . Ендеше жалғастырайық.
<сынып атауы>{ата-аналық сыныптан мұра} {интерфейсті іске асыру}
Сонымен, бізде не бар: {class access modifier} - тек жалпы модификаторлар мен жетіспейтін қатынас модификаторы, яғни әдепкі сынып үшін қол жетімді . {class static} - static - бұл класстың статикалық екенін көрсететін модификатор, тек ішкі сыныптарға (басқа сыныптар ішіндегі сыныптар) қатысты. {class finality} - есімізде, бұл соңғы модификатор , оның қатысуымен класс мұраланbyteын болады (қораптағы мысал - String ). {сынып абстракциясы} - модификатор - абстракт , бұл класста орындалмаған әдістер болуы мүмкін екенін көрсетеді. Бұл модификатор соңғы модификатормен қайшы келеді , яғни олардың тек біреуі ғана класс тақырыбында болуы мүмкін, өйткені абстрактілі модификатор берілген класс мұраға алынатынын және оның дерексіз бөліктерінің орындалатынын білдіреді. Ал финал бұл сыныптың соңғы (соңғы) нұсқасы екенін және оны мұраға алуға болмайтынын көрсетеді. Шын мәнінде, екі модификаторды бір уақытта пайдалану абсурд болар еді, ал компилятор бізге мұны істеуге мүмкіндік бермейді. <сынып> - сынып декларациясын көрсететін қажетті кілт сөз. <сынып атауы> - қарапайым класс атауы, ол нақты Java класының идентификаторы болып табылады. Толық жарамды сынып атауы толық жарамды бума атауынан тұрады + . + қарапайым сынып атауы. {Heritance from Parent class} - extensions кілт сөзі арқылы ата-аналық сыныпты (бар болса) көрсету . Мысалы, .. ParentClass кеңейтеді . {интерфейсті жүзеге асыру} - bu класс жүзеге асыратын интерфейстерді (бар болса) implements кілт сөзі арқылы көрсету . Мысалы: ... FirstInterface, SecondInterface іске асырады ... Класс тақырыбының мысалы ретінде Cat жүйесінен мұра болып табылатын және WildAnimal интерфейсін жүзеге асыратын Lion сыныбының тақырыбын қарастырайық :
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 пайдалана алмайды, себебі:
- конструкторды жариялағанда сізде қайтару түріне ұқсас ештеңе болмайды;
- Әдетте конструктор дананы құру кезінде жасырын түрде шақырылады;
- Конструктор әдіс емес: бұл жалғыз мақсаты даналық айнымалыларды инициализациялау болып табылатын жеке механизм және жаңа оператор нысанды жасауға жауап береді .
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. Класс тақырыбы қандай элементтерден тұрады? Мысал жаз
Класс тақырыбын құрайтын элементтер туралы айтатын болсақ, шағын диаграмманы қарастырайық:- міндетті компоненттер жақшада <> болады
- қосымша - {} ішінде
public final class Lion extends Cat implements WildAnimal
32. Әдіс тақырыбы қандай элементтерден тұрады? Мысал жаз
Тағы да, әдіс тақырыбын құрайтын элементтерді қараған кезде, шағын диаграмманы қарастырыңыз, мұнда:- міндетті компоненттер жақшада <>
- қосымша - {} ішінде
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);
}
}
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 нысаны жасалғанда және бірінші конструктор шақырылғанда, нысанның екі өрісі де шақырылады және сәтті инициализацияланады. Бірнеше нюанстар бар:
- this() тек конструкторда жұмыс істейді.
- Басқа конструкторға сілтеме конструктор блогының (денесінің) бірінші жолында болуы керек. Сондықтан бір конструкторда берілген класстың бірнеше (басқа) конструкторын шақыруға болмайды.
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 . Әрі қарай, инициализация блоктары іске қосылған сәтті жақсы түсіну үшін классты (оның ата-тегімен бірге) инициализациялау тәртібін көре аламыз.
36. Сыныптың жалпы сыныбын мұраға алу үшін Child extensions Parent, нысанды инициализациялау ретін жазыңыз.
Child сыныбы жүктелген кезде, инициализация реті келесідей болады:- Ата-ана класының статикалық өрістері .
- Ата-ана класы үшін статикалық инициализация блогы .
- Child класының статикалық өрістері .
- Child сыныбына арналған статикалық инициализация блогы .
- Ата-ана класының статикалық емес өрістері .
- Ата-ана класы үшін статикалық инициализация блогы емес .
- Ата-ана сыныбына арналған конструктор .
- Child сыныбының статикалық емес өрістері .
- Child сыныбы үшін статикалық инициализация блогы емес .
- Балалар сыныбының конструкторы .
37. Класстар (an objectілер) арасындағы қандай қатынастарды білесіз?
Java тілінде сыныптар арасындағы қатынастың екі түрі бар:- IS- қарым-қатынас
Lion IS-A Cat
(бірақ әрбір мысық арыстан емес ) Интерфейстерде жағдай дәл солай. Егер Lion класы WildAnimal интерфейсін жүзеге асырса , онда олар да қатынаста болады:
Lion IS-A WildAnimal
- HAS-A қатынастары
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 класының функционалдығы бұған байланысты емес. Агрегация сонымен қатар нысанды басқа нысан пайдаланған кезде, біріншісі басқа нысандарда қолданылуы мүмкін екенін білдіреді. Мысалы, бір студент тоқыма үйірмесіне де, рокерлердің музыкалық тобына да мүше бола алады және сонымен бірге ағылшын тілін үйренушілер тобына бара алады. Өздеріңіз түсінгеніңіздей, біріктіру - бұл сыныптар арасындағы неғұрлым еркін ассоциациялық қатынас. Композиция - бұл 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 пайдаланған кезде, біріншісі басқа біреуге тиесілі болмайтынын білдіреді. Біздің мысалға оралатын болсақ, қозғалтқыш бір ғана автомобильге тиесілі болуы мүмкін, бірақ бір уақытта екі немесе одан да көп емес. Бүгін осында тоқтайтын шығармыз.
GO TO FULL VERSION