JavaRush /Java блогу /Random-KY /Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун...
Константин
Деңгээл

Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи. 4-бөлүк

Группада жарыяланган
Баарына салам, бүгүн мен Java иштеп чыгуучусу үчүн 250+ интервью суроолорун талдоону улантамын . Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  4-1-бөлүкАнализдин мурунку бөлүктөрү: биринчи , экинчи , үчүнчү . Андыктан уланталы.

29. Конструктордо кайтарууну колдонууга болобу?

Сиз мүмкүн, бирок кайтаруу укугуна кайтаруу мааниси жок . Башкача айтканда, сиз кайтарууну колдоно аласыз ; кийинки codeдун аткарылышын тез арада бүтүрүү (үзгүлтүккө учуратуу) жана an objectти инициализациялоону аяктоо үчүн конструктордо эсептөөлөр учурунда көмөкчү курулуш катары. Мисалы, бизде Cat классы бар жана эгерде 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 колдоно алbyte, анткени:
  • конструкторду жарыялоодо сизде кайтаруу түрүнө окшош эч нерсе болбойт;
  • Адатта, конструктор инстанциялоо учурунда кыйыр түрдө чакырылат;
  • Конструктор метод эмес: бул өзүнчө механизм, анын жалгыз максаты инстанция өзгөрмөлөрүн инициализациялоо жана жаңы оператор an objectти түзүү үчүн жооп берет .
Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  4-2-бөлүк

30. Конструктордон өзгөчөлүктү ыргытуу мүмкүнбү?

Конструкторлор өзгөчө учурларды ыкмалар сыяктуу эле чечишет. Жана эгер методдор методдун башына <ExceptionType> ыргытууларды жазуу менен өзгөчө учурларды ыргытууга мүмкүндүк берсе , анда конструктор бизге муну кылууга мүмкүндүк берет, ошондой эле мурастоочу конструкторду мурастап жана аныктоодо биз өзгөчө кырдаалдын түрүн кеңейте алабыз. Мисалы, IOException -> Exception (бирок тескерисинче эмес). Конструктор тарабынан өзгөчөлүктү ыргытууга мисал катары, 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. Класстын аталышы кандай элементтерден турат? Мисал жаз

Класстын башын түзгөн элементтер жөнүндө сөз кылып жатып, кичинекей диаграмманы карап көрөлү:
  • милдеттүү компоненттери кашаанын ичинде болот <>
  • кошумча - {} ичинде
{класска кирүү өзгөрткүчү}{класс статиктиги}класстын жыйынтыктуулугу}класстын абстракциясы} <класстын аталышы>{Ата-эне классынан мурас} {интерфейстин ишке ашырылышы} Ошентип, бизде эмне бар: {класстын кирүү өзгөрткүчү} - класс үчүн жалпыга ачык өзгөрткүчтөр жана жетишпеген мүмкүндүк модфикатору, башкача айтканда, демейки , гана жеткorктүү . {class static} - static бул класстын статикалык экенин көрсөткөн өзгөрткүч, ички класстарга (башка класстар ичиндеги класстарга) гана тиешелүү. {класстын жыйынтыктуулугу} - эсибизде тургандай, бул класс тукум куубай турган акыркы модификатор (мисалы кутучадан - String ). {класстын абстракциясы} - өзгөрткүч - абстракт , бул класста аткарылбаган методдор болушу мүмкүн экенин көрсөтүп турат. Бул модификатор акыркы модификатор менен карама-каршы келет , башкача айтканда, алардын бирөө гана класстын аталышында болушу мүмкүн, анткени абстракттуу модификатор берилген класстын тукум кууларын жана анын абстракттуу бөлүктөрүн ишке ашырууну билдирет. Ал эми финал бул класстын акыркы (акыркы) versionсы экенин жана аны тукум кууруу мүмкүн эмес экенин көрсөтөт. Чынында, эки модификаторду бир эле учурда колдонуу абсурд болот жана компилятор муну жасоого жол бербейт. <класс > класс декларациясын көрсөткөн талап кылынган ачкыч сөз. <класстын аты> - бул белгилүү бир Java классынын идентификатору болгон жөнөкөй класс аты. Толук квалификацияланган класс аталышы толук квалификациялуу пакет аталышынан + турат. + жөнөкөй класс аты. {Ата-эне классынан мурас} - extends ачкыч сөзүн колдонуу менен ата-эне классты (эгер бар болсо) көрсөтүү . Мисалы, .. ParentClass кеңейтет . {интерфейсти ишке ашыруу} - бул класс ишке ашырган интерфейстерди (эгер бар болсо) implements ачкыч сөзүн колдонуу менен көрсөтүү . Мисалы: ... FirstInterface, SecondInterfaceти ишке ашырат ... Класстын аталышынын мисалы катары, Lion классынын башын карап көрөлү, ал Catтан мурастап , WildAnimal интерфейсин ишке ашырат :
public final class Lion extends Cat implements WildAnimal
Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  4-3-бөлүк

32. Методтун аталышы кандай элементтерден турат? Мисал жаз

Дагы бир жолу, методдун башын түзгөн элементтерди карап жатканда, кичинекей диаграмманы карап көрүңүз, анда:
  • милдеттүү компоненттери кашаанын ичинде <>
  • кошумча - {} ичинде
{мүмкүнчүлүк өзгөрткүч} {метод static} {метод абстракция}} методдун акыркылыгы} синхрондоштуруу өзгөрткүч} {өзгөрткүч} {кайтаруучу маани >< методдун аталышы> <(> {ыкма аргументтери} <)>{ыргытылган өзгөчөлүктөр} {кирүү мүмкүнчүлүгүн өзгөрткүч } — бардык мүмкүндүк модификаторлор метод үчүн жеткorктүү: public , protected , default , private . {method static} - static бул методдун статикалык экенин, башкача айтканда, an objectке эмес, класска байланганын көрсөткөн модификатор. {method abstraction} абстракттуу өзгөрткүч , ал методдун ишке ашырылбаганын (денеси) көрсөтөт . Туура иштеши үчүн, ошондой эле ыкма берилген класс үчүн абстракттуу модификатор керек . Класстын башындагыдай эле, бул өзгөрткүч акыркы модификатор менен карама-каршы келет , бирок ага кошумча, ал статикалык өзгөрткүч менен да карама-каршы келет , анткени абстракттуу ыкма тукумдагы ыкманы жокко чыгарууну билдирет, ал эми статикалык методдор жокко чыгарылbyte. {методдун акыркылыгы} - финал - бул ыкманы жокко чыгарууга болбостугун көрсөткөн өзгөртүүчү. {синхрондоштуруу өзгөрткүч} - синхрондоштуруу - бул ыкма ар кандай жиптерден ага бир эле учурда жетүү корголгон дегенди билдирет өзгөрткүч. Эгерде метод статикалык эмес болсо, ал an objectтин бул мутексинде жабылат. Эгерде метод статикалык болсо, ал учурдагы класстын мутексинде жабылат. {Native modifier} - жергorктүү - бул өзгөрткүч ыкма башка программалоо тorнде жазылганын көрсөтөт. <кайтаруучу маани> - бул метод кайтарууга тийиш болгон маанинин түрү. Эгер ал эч нерсе кайтарбаса, жокко чыгарыңыз . <методдун аталышы> - методдун аталышы, анын системадагы идентификатору. {метод аргументтери} - бул метод талап кылган аргументтер (параметрлер): алар анын функционалдуулугун ишке ашыруу үчүн зарыл. {throwable exceptions} - throwsExceptionType - бул ыкма ыргыта ала турган текшерилген өзгөчөлүктөрдүн тизмеси. Ал эми методдун аталышынын мисалы катары мен муну берем:
public static void main(String[] args) throws IOException

33. Түпкү an objectте демейки конструкторду түзүңүз, эгерде ал негизги an objectте аныкталбаса (бирок башка конструктор аныкталган)

Мен суроонун өзүн толук түшүнгөн жокмун, бирок бул, мисалы , ата-энеде бизде кандайдыр бир жеке конструктор бар экенин билдирет:
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 тorнде бул эки башка мааниге ээ. 1. Учурдагы an objectке шилтеме катары, this.age = 9 . Башкача айтканда, бул ал чакырылган an objectке жана аны колдонгон codeго тиешелүү . Негизги милдети - codeдун окууга жөндөмдүүлүгүн жогорулатуу жана түшүнүксүздүктү болтурбоо. Мисалы, ички класс талаасынын аты жана метод аргументи бирдей болсо:
public void setName(String name) {
   this.name = name;
}
Башкача айтканда, this.name – бул an objectтин аталышынын талаасы, бул метод аргументи.Бул шилтемени статикалык методдордо колдонууга болбойт. 2. бул конструктордо this(value) сыяктуу ыкма чакырыгы түрүндө колдонулушу мүмкүн . Бул учурда, ал ошол эле класстагы башка конструкторго чакыруу болот. Кыскача айтканда, an object түзүп жатканда бир эле учурда эки конструкторду чакыра аласыз:
public Cat(int age, String name) {
   this(name);
   this.age = age;
}

public Cat(String name) {
   this.name = name;
}
Cat an objectи түзүлгөндө жана биринчи конструктор чакырылганда, an objectтин эки талаалары тең чакырылып, ийгorктүү инициализацияланат. бир нече нюанстар бар:
  1. this() конструктордо гана иштейт.
  2. Башка конструкторго шилтеме конструктор блогунун (денесинин) биринчи сабында болушу керек. Демек, берилген класстын бирден ашык (башка) конструкторун бир конструктордо чакырууга болбойт.
Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  4-5-бөлүкКөбүрөөк мисалдар бул макалада .

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

Мен түшүнгөндөй, бул суроодо биз кадимки жана статистикалык инициализация блоктору жөнүндө сөз болуп жатат. Биринчиден, инициализация деген эмне экенин эстеп көрөлү. Инициализация – бул түзүү, активдештирүү, ишке даярдоо, параметрлерди аныктоо. Программаны же компонентти колдонууга даяр абалга келтирүү. Эсиңизде болсун, an objectти түзүү учурунда класс өзгөрмөсүн жарыялоодо түздөн-түз инициализациялоого болот:
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;
   }
Бирок дагы бир жолу бар: класстын ичиндеги тармал кашааларга окшош { } аты жок (метод же конструктор сыяктуу) инициализациялоо блогу аркылуу ички an object өзгөрмөсүн коюу:
class Cat {
   private int age;
   private  String name;

   {
       age = 10;
       name = "Tom";
   }
Башкача айтканда, инициализациялоо блогу - бул an object түзүлгөндө жүктөлгөн codeдун бөлүгү. Эреже катары, мындай блоктор классты жүктөөдө зарыл болгон кээ бир татаал эсептөөлөрдү жүргүзүү үчүн колдонулат. Бул эсептөөлөрдүн натыйжалары өзгөрмөлөр үчүн маанилер катары көрсөтүлүшү мүмкүн. Ошондой эле, кадимки инициализация блокторунан тышкары, окшош көрүнгөн, бирок тармал кашаанын алдында статикалык ачкыч сөзү бар статикалык блоктор бар :
class Cat {
   private static int age;
   private static String name;

   static{
       age = 10;
       name = "Tom";
   }
Бул блок мурункуга окшош. Бирок эгер кадимки an object ар бир an object инициализацияланганда иштетилсе, анда статикалык класс жүктөлгөндө бир гана жолу ишке кирет. Мындай блокто, эреже катары, статикалык класстын өзгөрмөлөрүнүн кийинки инициализациясы үчүн да кээ бир татаал эсептөөлөр жүргүзүлөт. Ошол эле чектөөлөр статикалык блокко карата статикалык методдордо колдонулат: ал статикалык эмес маалыматтарды, ошондой эле учурдагы an objectке шилтемени колдоно алbyte - бул . Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  4-6-бөлүкАндан кийин, инициализациялоо блоктору иштетилген учурду жакшыраак түшүнүү үчүн классты инициализациялоо тартибин (анын ата-теги менен бирге) көрө алабыз.

36. Класстын коомдук классын мурастоо үчүн Child extensions Parent, an objectти инициализациялоо тартибин жазыңыз

Child классы жүктөлгөндө, инициализация тартиби төмөнкүдөй болот:
  1. Ата-эне классынын статикалык талаалары .
  2. Ата- класс үчүн статикалык инициализациялоо блогу .
  3. Child классынын статикалык талаалары .
  4. Child классы үчүн статикалык инициализация блогу .
  5. Parent классынын статикалык эмес талаалары .
  6. Parent классы үчүн статикалык инициализация блогу эмес .
  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
Жана тескерисинче: эгерде Жүргүнчүнүн Автоунаа шилтемеси бар болсо , анда бул байланыш болот:
Passenger HAS-A Car

38. Объекттердин ортосундагы кандай ассоциативдик байланыштарды билесиз?

Агрегация жана состав – бул ассоциациянын өзгөчө учурларынан башка эч нерсе эмес. Агрегация – бул бир an object экинчисинин бөлүгү болгон мамиле. Мисалы, жүргүнчү унаада болушу мүмкүн. Ошондой эле, бир нече жүргүнчү болушу мүмкүн же такыр жок (эгерде биз Тесла жөнүндө сөз болсо, анда айдоочу талап кылынbyte). Мисалы:
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терде колдонулушу мүмкүн экенин билдирет. Мисалы, бир эле студент трикотаж клубунун да, рокерлердин музыкалык тобунун да мүчөсү боло алат жана ошол эле учурда англис тorн үйрөнгөндөрдүн тобуна бара алат. Сиз түшүнгөндөй, агрегация класстар ортосундагы бир кыйла бошыраак ассоциативдик байланыш. Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи.  4-8-бөлүкКомпозиция - бул an object башка an objectтин бир бөлүгү гана эмес, башка an objectинин иши биринчисине абдан көз каранды болгондо дагы катуу мамиле. Мисалы, машина мотору. Мотор машинасыз бар болсо да, анын сыртында эч нерсеге жараbyte. Ооба, машина моторсуз иштей алbyte:
public class Car {
   private Engine engine;

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

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