JavaRush /Java blogi /Random-UZ /Java dasturchisi uchun intervyudan olingan savollar va ja...

Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish. 4-qism

Guruhda nashr etilgan
Hammaga salom, bugun men Java dasturchisi uchun 250+ intervyu savollarini tahlil qilishni davom ettiraman. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  4-1-qismTahlilning oldingi qismlari: birinchi , ikkinchi , uchinchi . Shunday ekan, davom etaylik.

29. Konstruktorda return dan foydalanish mumkinmi?

Siz mumkin, lekin qaytish o'ng tomonida qaytish qiymati holda . Ya'ni, siz qaytishdan foydalanishingiz mumkin; keyingi kodning bajarilishini zudlik bilan tugatish (to'xtatish) va ob'ektni ishga tushirishni yakunlash uchun konstruktorda hisob-kitoblar paytida yordamchi qurilish sifatida. Masalan, bizda Cat sinfi bor va agar mushuk uysiz bo'lsa - isHomeless = true , biz ishga tushirishni tugatishimiz va boshqa maydonlarni to'ldirmasligimiz kerak (axir, ular bizga noma'lum, chunki mushuk uysiz):
public Cat(int age, String name, boolean isHomeless) {
   if (isHomeless){
       this.isHomeless = isHomeless;
       return;
   }
   this.isHomeless = isHomeless;
   this.age = age;
   this.name = name;
}
Ammo aniq qiymatlar haqida gap ketganda, konstruktor qiymatni qaytarish uchun return dan foydalana olmaydi, chunki:
  • konstruktorni e'lon qilishda sizda qaytish turiga o'xshash narsa bo'lmaydi;
  • Odatda, konstruktor instantsiyalash vaqtida bevosita chaqiriladi;
  • Konstruktor usul emas: bu alohida mexanizm bo'lib, uning yagona maqsadi misol o'zgaruvchilarini ishga tushirishdir va yangi operator ob'ektni yaratish uchun javobgardir .
Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  4-2-qism

30. Konstruktordan istisno tashlash mumkinmi?

Konstruktorlar istisnolar bilan usullar bilan bir xil tarzda shug'ullanishadi. Va agar usullar usul sarlavhasiga throws <ExceptionType> yozish orqali istisnolarni tashlashga imkon bersa , u holda konstruktor bizga buni amalga oshirishga imkon beradi, shuningdek merosxo'r konstruktorni meros qilib olish va aniqlashda istisno turini kengaytirishimiz mumkin. Masalan, IOException -> Istisno (lekin aksincha emas). Konstruktor tomonidan istisno qilish uchun misol sifatida, keling, Cat sinfini olaylik . Aytaylik, uni yaratishda biz konsoldan ism va yoshni kiritmoqchimiz:
public Cat() throws IOException {
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   this.name = reader.readLine();
   this.age = Integer.parseInt(reader.readLine());
}
Reader.readLine() IOExceptionni tashlaganligi sababli , biz uni mumkin bo'lgan istisno sifatida sarlavhada ko'rsatamiz.

31. Sinf sarlavhasi qanday elementlardan iborat? Misol yozing

Sinf sarlavhasini tashkil etuvchi elementlar haqida gapirganda, keling, kichik diagrammani ko'rib chiqaylik:
  • majburiy komponentlar qavs ichida bo'ladi <>
  • ixtiyoriy - {} ichida
{sinfga kirish modifikatori}{klass statikligi}sinf yakuniyligi}sinf abstraksiyasi} <sinf nomi>{ota-ona sinfidan meros} {interfeysni amalga oshirish} Shunday qilib, bizda nima bor: {sinfga kirish modifikatori} - sinf uchun faqat umumiy o'zgartiruvchilar va etishmayotgan kirish modifikatorlari, ya'ni default , mavjud . {class static} - statik bu sinfning statik ekanligini ko'rsatadigan modifikator bo'lib, faqat ichki sinflarga (boshqa sinflar ichidagi sinflar) tegishli. {sinf yakuniyligi} - biz eslaganimizdek, bu oxirgi modifikator bo'lib , uning mavjudligida sinf meros qilib bo'lmaydigan holga keladi (qutidan misol - String ). {sinf abstraksiyasi} - modifikator - abstrakt , bu sinfda bajarilmagan usullar bo'lishi mumkinligini ko'rsatadi. Ushbu modifikator yakuniy modifikator bilan ziddiyatga ega , ya'ni ulardan faqat bittasi sinf sarlavhasida bo'lishi mumkin, chunki mavhum modifikator berilgan sinf meros qilib olinishi va uning mavhum qismlari amalga oshirilishini anglatadi. Va final bu sinfning yakuniy (yakuniy) versiyasi ekanligini va uni meros qilib olish mumkin emasligini ko'rsatadi. Aslida, ikkala modifikatorni bir vaqtning o'zida ishlatish bema'nilik bo'lar edi va kompilyator buni amalga oshirishga ruxsat bermaydi. <sinf> - bu sinf deklaratsiyasini bildiruvchi talab qilinadigan kalit so'z. <sinf nomi> oddiy sinf nomi boʻlib, u maʼlum Java sinfining identifikatoridir. To'liq malakali sinf nomi to'liq malakali paket nomidan iborat + . + oddiy sinf nomi. {Ota sinfidan meros} - kengaytirilgan kalit so'z yordamida ota-klassni (agar mavjud bo'lsa) belgilash . Masalan, .. ParentClass ni kengaytiradi . {interfeysni amalga oshirish} - bu sinf amalga oshiradigan interfeyslarni (agar mavjud bo'lsa) implements kalit so'zidan foydalanib belgilash . Misol uchun: ... FirstInterface, SecondInterface-ni amalga oshiradi ... Xo'sh, sinf sarlavhasiga misol sifatida, Cat -dan meros bo'lib , WildAnimal interfeysini amalga oshiradigan Lion sinfining sarlavhasini ko'rib chiqing :
public final class Lion extends Cat implements WildAnimal
Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  4-3-qism

32. Usul sarlavhasi qanday elementlardan iborat? Misol yozing

Shunga qaramay, usul sarlavhasini tashkil etuvchi elementlarni ko'rib chiqayotganda, kichik diagrammani ko'rib chiqing, bu erda:
  • majburiy komponentlar qavs ichida <>
  • ixtiyoriy - {} ichida
{access modifier}{method static}{method abstraction}{method finality}{sinxronization modifier} {native modifier}qaytaruvchi qiymat><metod name> <(> {usuli argumentlari} <)>{tashlangan istisnolar} {kirish oʻzgartiruvchisi } — barcha kirish modifikatorlari usul uchun mavjud: public , protected , default , private . {metod static} - statik modifikator bo'lib, bu usulning statik ekanligini, ya'ni ob'ektga emas, balki sinfga bog'langanligini bildiradi. {metod abstraction} mavhum modifikator boʻlib , u usulning amalga oshirilishi (tanasi) yoʻqligini koʻrsatadi. To'g'ri ishlash uchun sizga usul taqdim etilgan sinf uchun mavhum modifikator ham kerak. Sinf sarlavhasida bo'lgani kabi, bu modifikator yakuniy modifikatorga zid keladi , lekin unga qo'shimcha ravishda u statik modifikatorga ham zid keladi , chunki mavhum usul avloddagi usulni bekor qilishni nazarda tutadi va statik usullar bekor qilinmaydi. {usulning yakuniyligi} - yakuniy - bu usulni bekor qilib bo'lmasligini ko'rsatadigan modifikator. {sinxronizatsiya modifikatori} - sinxronlashtirilgan - modifikator, bu usul bir vaqtning o'zida unga turli xil oqimlardan kirishdan himoyalanganligini anglatadi. Agar usul statik bo'lmasa, u ob'ektning ushbu mutexida yopiladi. Agar usul statik bo'lsa, u joriy sinfning mutexida yopiladi. {native modifier} - mahalliy - bu modifikator usulning boshqa dasturlash tilida yozilganligini bildiradi. <qaytish qiymati> - bu usul qaytarishi kerak bo'lgan qiymat turi. Agar u hech narsa qaytarmasa, void . <usul nomi> - bu usulning nomi, uning tizimdagi identifikatori. {metod arguments} - bu usul oladigan argumentlar (parametrlar): ular uning funksionalligini amalga oshirish uchun zarurdir. {throwable exceptions} - throwsExceptionType - bu usul tashlashi mumkin bo'lgan tekshirilgan istisnolar ro'yxati. Va usul sarlavhasiga misol sifatida men buni beraman:
public static void main(String[] args) throws IOException

33. Agar asosiy ob'ektda aniqlanmagan bo'lsa (lekin boshqa konstruktor aniqlangan) avlod ob'ektida standart konstruktor yarating.

Men savolning o'zini to'liq tushunmayapman, lekin bu, masalan , ota-onada bizda maxsus konstruktor borligini anglatadi:
public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
Shuning uchun, ajdodlar sinfida, albatta, ota-konstruktorni to'ldiradigan (chaqiradigan) konstruktorni aniqlashimiz kerak:
public  class Lion extends Cat {

   public Lion(int age, String name) {
       super(age, name);
   }
}
Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  4-4-qism

34. this kalit so'zi qachon ishlatiladi?

Java-da bu ikki xil ma'noga ega. 1. Joriy ob'ektga havola sifatida, this.age = 9 kabi . Ya'ni, bu o'zi chaqirilgan ob'ektga va uni ishlatadigan kodga tegishlidir . Asosiy funktsiya kodni o'qish qobiliyatini oshirish va noaniqlikdan qochishdir. Masalan, agar ichki sinf maydonining nomi va usul argumenti bir xil bo'lsa:
public void setName(String name) {
   this.name = name;
}
Ya'ni this.name - ob'ekt nomining maydoni - bu usul argumenti.Ushbu havolani statik usullarda ishlatib bo'lmaydi. 2. this (value) kabi usul chaqiruvi shaklida konstruktorda ishlatilishi mumkin . Bunday holda, u xuddi shu sinfdagi boshqa konstruktorga qo'ng'iroq bo'ladi. Qisqasi, ob'ekt yaratishda bir vaqtning o'zida ikkita konstruktorni chaqirishingiz mumkin:
public Cat(int age, String name) {
   this(name);
   this.age = age;
}

public Cat(String name) {
   this.name = name;
}
Cat ob'ekti yaratilganda va birinchi konstruktor chaqirilganda, ob'ektning ikkala maydoni ham chaqiriladi va muvaffaqiyatli ishga tushiriladi. Bir nechta nuanslar mavjud:
  1. this() faqat konstruktorda ishlaydi.
  2. Boshqa konstruktorga havola konstruktor blokining (tanasi) birinchi qatorida bo'lishi kerak. Shuning uchun bitta konstruktorda berilgan sinfning bir nechta (boshqa) konstruktorlarini chaqirish mumkin emas.
Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  4-5-qismKo'proq misollar ushbu maqolada .

35. Initsializator nima?

Men tushunganimdek, bu savolda biz oddiy va statistik ishga tushirish bloklari haqida gapiramiz. Birinchidan, ishga tushirish nima ekanligini eslaylik. Initializatsiya - yaratish, faollashtirish, ishga tayyorlash, parametrlarni aniqlash. Dastur yoki komponentni foydalanishga tayyor holatga keltirish. Esingizda bo'lsa, ob'ektni yaratish jarayonida sinf o'zgaruvchisi to'g'ridan-to'g'ri deklaratsiyadan keyin ishga tushirilishi mumkin:
class Cat {
   private int age = 9;
   private  String name = "Tom";
Yoki uni konstruktor orqali tashqaridan o'rnating:
class Cat {
   private int age;
   private  String name;

   public Cat(int age, String name) {
       this.age = age;
       this.name = name;
   }
Ammo boshqa yo'l ham bor: initsializatsiya bloki orqali ichki ob'ekt o'zgaruvchisini o'rnatish, u sinf ichidagi jingalak qavslarga o'xshaydi , nomsiz (usul yoki konstruktor kabi):
class Cat {
   private int age;
   private  String name;

   {
       age = 10;
       name = "Tom";
   }
Ya'ni, ishga tushirish bloki ob'ekt yaratilganda yuklanadigan kod qismidir. Odatda, bunday bloklar sinfni yuklashda zarur bo'lgan ba'zi murakkab hisob-kitoblarni bajarish uchun ishlatiladi. Ushbu hisob-kitoblarning natijalari o'zgaruvchilar uchun qiymat sifatida belgilanishi mumkin. Bundan tashqari, odatiy ishga tushirish bloklariga qo'shimcha ravishda, bir xil ko'rinishga ega, ammo jingalak qavsdan oldin statik kalit so'zga ega bo'lgan statik bloklar mavjud :
class Cat {
   private static int age;
   private static String name;

   static{
       age = 10;
       name = "Tom";
   }
Ushbu blok avvalgisiga o'xshaydi. Ammo har bir ob'ekt ishga tushirilganda oddiy ob'ekt ishga tushirilsa, statik ob'ekt faqat bir marta, sinf yuklanganda ishga tushadi. Bunday blokda, qoida tariqasida, statik sinf o'zgaruvchilarining keyingi ishga tushirilishi uchun ba'zi murakkab hisoblar ham amalga oshiriladi. Xuddi shu cheklovlar statik blok uchun statik usullarga nisbatan qo'llaniladi: u statik bo'lmagan ma'lumotlardan, shuningdek joriy ob'ektga havoladan foydalana olmaydi - bu . Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  4-6-qismKeyinchalik, ishga tushirish bloklari ishga tushirilgan vaqtni yaxshiroq tushunish uchun sinfni (uning ajdodi bilan birga) ishga tushirish tartibini ko'rishimiz mumkin.

36. Child extensions Parent sinfining umumiy sinfini meros qilib olish uchun obyektni ishga tushirish tartibini yozing.

Child klassi yuklanganda ishga tushirish tartibi quyidagicha bo'ladi:
  1. Parent sinfining statik maydonlari .
  2. Ota- klass uchun statik ishga tushirish bloki .
  3. Child sinfining statik maydonlari .
  4. Child sinfi uchun statik ishga tushirish bloki .
  5. Parent sinfining statik bo'lmagan maydonlari .
  6. Ota- klass uchun statik ishga tushirish bloki emas .
  7. Ota-onalar sinfi uchun konstruktor .
  8. Child sinfining statik bo'lmagan maydonlari .
  9. Child sinfi uchun statik ishga tushirish bloki emas .
  10. Bolalar sinfi konstruktori .
Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  4-7 qismMana, amaliyotda ishga tushirish tartibini tushuntiruvchi qisqa maqola.

37. Sinflar (ob'ektlar) o'rtasidagi qanday munosabatlarni bilasiz?

Java-da sinflar o'rtasidagi munosabatlarning ikki turi mavjud:
  • IS-A munosabatlari
OOPdagi IS-A printsipi sinf merosiga yoki interfeysni amalga oshirishga asoslangan. Misol uchun, agar Lion sinfi Cat dan meros bo'lsa , biz Lion Cat deb aytamiz :
Lion IS-A Cat
(lekin har bir mushuk ham sher emas ) Interfeyslar bilan vaziyat aynan bir xil. Agar Lion klassi WildAnimal interfeysini amalga oshirsa , ular ham munosabatda bo'ladi:
Lion IS-A WildAnimal
  • HAS-A munosabatlari
Ushbu turdagi munosabatlar boshqa sinflar tomonidan sinflardan foydalanishga asoslangan bo'lib, ular "assotsiatsiya" deb ham ataladi. Assotsiatsiya - bu boshqa sinfga (yoki hatto bir-biriga) havola qiladigan sinf. Masalan, Avtomobil sinfi Passenger sinfiga murojaat qilishi mumkin va bu munosabatlar bo'ladi:
Car HAS-A Passenger
Va aksincha: agar Yo'lovchida Avtomobilga havola bo'lsa , unda bu munosabat bo'ladi:
Passenger HAS-A Car

38. Narsalar orasidagi qanday assotsiativ aloqalarni bilasiz?

Agregatsiya va kompozitsiya birlashmaning maxsus holatlaridan boshqa narsa emas. Agregatsiya - bu bir ob'ekt boshqa ob'ektning bir qismi bo'lgan munosabatlar. Misol uchun, yo'lovchi mashinada bo'lishi mumkin. Bundan tashqari, bir nechta yo'lovchilar bo'lishi mumkin yoki umuman bo'lmasligi mumkin (agar biz Tesla haqida gapiradigan bo'lsak, unda haydovchi talab qilinmaydi). Masalan:
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();
   }
}
Ya'ni, biz yo'lovchilar soni (yoki umuman bor-yo'qligi) haqida qayg'urmaymiz: Avtomobil sinfining funksionalligi bunga bog'liq emas. Agregatsiya, shuningdek, ob'ekt boshqa ob'ekt tomonidan ishlatilganda, birinchisi boshqa ob'ektlarda ishlatilishi mumkinligini anglatadi. Masalan, bitta talaba ham trikotaj klubi, ham rokchilarning musiqiy guruhi a'zosi bo'lishi mumkin va shu bilan birga ingliz tilini o'rganuvchilar guruhiga borishi mumkin. Siz tushunganingizdek, agregatsiya sinflar o'rtasidagi erkinroq assotsiativ munosabatlardir. Agar ob'ekt nafaqat boshqa ob'ektning bir qismi bo'lsa, balki boshqa ob'ektning ishi birinchisiga juda bog'liq bo'lsa, Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  4-8-qismkompozitsiya yanada qattiqroq munosabatlardir. Masalan, avtomobil dvigateli. Dvigatel avtomobilsiz mavjud bo'lishi mumkin bo'lsa-da, uning tashqarisida foydasiz. Xo'sh, mashina dvigatelsiz ishlamaydi:
public class Car {
   private Engine engine;

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

   void startMoving() {
       engine.start();
           ...
   }
Tarkibi, shuningdek, ob'ekt boshqa ob'ekt tomonidan ishlatilganda, birinchisi boshqa birovga tegishli bo'lmasligini anglatadi. Bizning misolimizga qaytadigan bo'lsak, dvigatel faqat bitta mashinaga tegishli bo'lishi mumkin, lekin bir vaqtning o'zida ikkita yoki undan ko'p emas. Ehtimol, bugun shu erda to'xtab qolamiz.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  4-9-qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION