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

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

Guruhda nashr etilgan
Salom! Maxsus tayyorgarliksiz samolyotda uchishni o'rganish mumkin bo'lmagani kabi, zarur nazariy asoslarni o'rganishga uzoq vaqt sarflamasdan Java dasturchisi bo'lish ham mumkin emas. Bugun biz aynan shu ustida ishlaymiz: Java dasturchilari uchun 250 dan ortiq intervyu savollarini va shunga mos ravishda ularga javoblarni tahlil qilishni davom ettiramiz . Mana tahlilning birinchi va ikkinchi qismlari. Ha, albatta, siz ushbu savollarning barchasisiz yaxshi Java dasturchisi bo'lishingiz mumkin. Biroq, agar siz Java tilining nozik tomonlarini yaxshi tushunsangiz, bu sizga ustunlik beradi va sizni bo'lajak ish beruvchingiz nazarida ko'proq orzu qilingan nomzodga aylantiradi.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  3-1 qism

20. Inkapsulyatsiya uchun qanday til elementlari javob beradi?

Esda tutganimizdek, inkapsulyatsiya sinfning amalga oshirish tafsilotlarini yashiradi. Ya'ni, bizning sinfimiz tashqaridan foydalanilganda, ichki mazmun va mantiq aniq emas. Buning uchun tilning qaysi elementlari javobgar? Tabiiyki, kirish modifikatorlari ! Biz yashirishimiz kerak bo'lgan narsani xususiy modifikator bilan belgilaymiz . Masalan, sinfning shaxsiy maydonlari yoki ma'lum ichki funksiyalarni amalga oshirishga yordam beradigan ba'zi ichki usullar. Va biz tashqi kirishni ta'minlamoqchi bo'lgan narsaga biz umumiy kirish modifikatorini qo'shamiz . Masalan, ba'zi bir funksionallikni ta'minlash uchun mas'ul bo'lgan usul (uning ichida ko'plab xususiy usullardan foydalanish mumkin) yoki sinfning shaxsiy maydonlariga kirish uchun bir xil qabul qiluvchilar va sozlagichlar. Oh, shuningdek, bizda standart va himoyalangan modifikatorlar mavjud bo'lib , ular sinfning tanlangan qismlariga kirishning yanada moslashuvchan va o'ziga xos konfiguratsiyasi uchun ishlatilishi mumkin.

21. Qaysi til elementlari meros uchun javobgardir?

Meros - bu boshqa sinf asosida sinflar yaratish imkonini beruvchi mexanizm. Java'da bu maqsadda kengaytirilgan kalit so'z ishlatiladi . Misol uchun, bizda ma'lum bir sinf bor Mushuk , va biz uning vorisi yaratmoqchimiz - Arslon . Kodda u shunday ko'rinadi:
public class Lion extends Cat
Va bu shuni anglatadiki, Lion sinfi Cat sinfining barcha usullari va o'zgaruvchilarini meros qilib oladi , statiklardan tashqari. Shuningdek, meros uchun mas'ul bo'lgan til elementlariga super kiradi . Bu shunga o'xshash havola , lekin u chaqirilgan ob'ektga tegishli bo'lsa-da , super joriy asosiy ob'ektga ishora qiladi. Odatda super ishlatiladi:
  1. Superklass konstruktorini chaqirish uchun: masalan, Cat klassi konstruktorda ishga tushirilishi kerak bo'lgan ichki o'zgaruvchi nomiga ega. Lion sinf konstruktorida u quyidagicha ko'rinadi:

    public Lion(final String name) {
       super(name);
    }
  2. Ota-ona maydonlari va usullariga kirish uchun: masalan, Cat sinfida bizda boshlang'ich yosh maydoni mavjud :

    public class Cat {
       int age = 10;
Shu bilan birga, bizda Lion da bir xil ishga tushirilgan maydon mavjud :
public class Lion extends Cat {
   int age = 15;
Va agar biz Lion ob'ektidan ota-ona ob'ektining yosh o'zgaruvchisiga kirishni istasak , buni super orqali qilishimiz kerak :
super.name

22. Polimorfizmga qaysi til elementlari javob beradi?

Polimorfizm - bitta imzoga ega bo'lgan ob'ektning ko'p shakllarni olish qobiliyati (bir nechta amalga oshirish). Ishonch bilan ayta olamizki, Java-da amaliy va kengaytirilganJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  3-2 qism kalit so'zlar polimorfizm uchun javobgardir . amalga oshiradi - interfeysimizni yaratganimizda, biz uning mumkin bo'lgan shakllaridan birini qaysidir sinfda amalga oshiramiz, lekin bu yagona shakl emas, shunday emasmi? Keling, amalga oshirish vositalari qanday ko'rinishini eslaylik :
public class Cat implements Animal
Va Cat sinfida biz Hayvon interfeysida taqdim etilgan barcha mavhum usullarni amalga oshirishimiz kerak . Xuddi shu narsa meros uchun ham amal qiladi: avlod sinfida biz allaqachon mavjud bo'lgan usulni bekor qilishimiz mumkin. Masalan: bir nechta avlodlar -> bir xil usulning bir nechta turli bekor qilishlari. Xo'sh, yoki superklass mavhum edi va uning har bir avlodi uchun maxsus tarzda amalga oshirilishi kerak bo'lgan ma'lum bir usul bor. Ya'ni, aytishimiz mumkinki, usul ko'p shakllarga ega bo'ladi. Bundan tashqari, @Override izohi bizga bu borada yordam berishi mumkin , u amalga oshirilgan usullardan yuqorida joylashgan va biz amalga oshirish yoki bekor qilmoqchi ekanligimizni bildiradi (agar amalga oshirish yuqori sinfda allaqachon mavjud bo'lsa) yuqori sinf yoki interfeysning u yoki bu usulini. Bu ixtiyoriy va xatolarni aniqlashni osonlashtirish uchun ishlatiladi. Ushbu izoh bilan siz kompilyatorga superklass/interfeys usulini bekor qilmoqchi ekanligingizni bildirasiz va bu usul imzosida xatolikka yo'l qo'ymasligingizni ta'minlaydi.

23. SOLID nima? Misollar keltiring

SOLID - Robert Martin tomonidan ishlab chiqilgan OOP uchun beshta asosiy dizayn printsipining qisqartmasi. S - Yagona javobgarlik printsipi - yagona javobgarlik printsipi, unda sinf faqat bitta maqsad va yagona maqsadga ega bo'lishi kerak. Ya'ni, siz hamma narsani bajaradigan sinflarni yaratmasligingiz kerak. Bunday holda siz "Ilohiy ob'ekt" antipatternini takrorlashingiz mumkin. Agar sizda Cat ob'ekti bo'lsa , unda ushbu misolga tegishli bo'lmagan biznes mantig'i emas, balki faqat uning ichki funksionalligi bilan o'zaro ta'sir qiluvchi usullar bo'lishi kerak. Masalan, ushbu turdagi ob'ektlarni biron bir joyda saqlash. Ushbu tashqi funksionallikni ( Cat ga nisbatan ) boshqa sinflarga, ba'zi xizmatlarga o'tkazish kerak, ularning vazifasi ushbu turdagi ob'ektlar uchun biznes mantiqini ta'minlashdir. O - ochiq-yopiq printsip - ochiqlik / yopiqlik printsipi. Bu shuni anglatadiki, dasturiy ta'minot ob'ektlari (sinflar, interfeyslar) kengaytirish uchun ochiq, lekin o'zgartirish uchun yopiq bo'lishi kerak. Misol uchun, bizga allaqachon mavjud bo'lgan Cat sinfining funksionalligiga o'xshash funksiya kerak edi , lekin biroz boshqacha. Cat sinfining funksionalligini o'zgartirish , u allaqachon ishlatilgan joylarni buzish o'rniga, biz meros yoki kompozitsiyadan foydalanamiz . Natijada, biz maqsadimizga Cat sinfining o'zgartirilgan funksionalligi bilan erishdik , lekin ayni paytda biz uni o'zgartirmadik yoki hech narsani buzmadik. L - Liskov almashtirish printsipi - Barbara Liskovning almashtirish printsipi. Prinsip shuni ko'rsatadiki, asosiy turdan foydalanadigan funktsiya uni bilmagan holda asosiy turdagi pastki tiplardan foydalanishi kerak. Misol uchun, bizning Cat sinfimiz xatti-harakatini tubdan o'zgartirmasdan , uning avlodlaridan birortasi bilan almashtirilishi kerak, deylik Lion . Umumiy mantiq (xulq-atvor) bir xil bo'lib qoladi, lekin u yoki bu funksionallikni amalga oshirish tafsilotlari o'zgaradi. I - interfeyslarni ajratish printsipi - interfeyslarni ajratish printsipi. Ushbu tamoyil shuni ko'rsatadiki, bitta universal interfeysdan ko'ra ko'plab ixtisoslashtirilgan (tor yo'naltirilgan) interfeyslarga ega bo'lish yaxshiroqdir. Misol uchun, foydalanuvchi ba'zi interfeysni amalga oshiradi, ulardan faqat ushbu usul kerak, lekin bu interfeysda kerakli usulning mantig'iga hech qanday aloqasi bo'lmagan yana to'qqizta usul mavjud. Bunday holda, foydalanuvchi o'nta interfeys usulini amalga oshirishi kerak bo'ladi, ulardan to'qqiztasi u uchun keraksizdir! Buning o'rniga, agar kerak bo'lsa, amalga oshirilishi mumkin bo'lgan o'n xil interfeyslarni qilish yaxshiroqdir. Xo'sh, o'nta emas, balki bir nechta, ular interfeysning umumiy maqsadi bilan chambarchas bog'liq bo'lgan usullarga ega bo'ladi. D - qaramlik inversiyasi printsipi— qaramlik inversiyasi printsipi. Printsip yuqori darajadagi modullar quyi darajadagi modullarga bog'liq bo'lmasligi kerakligini bildiradi. Ushbu tamoyil, shuningdek, "abstraksiya tafsilotlarga bog'liq bo'lmasligi kerak, tafsilotlar mavhumlikka bog'liq bo'lishi kerak" deb ham ta'riflanadi. Ya'ni, biz o'z mantiqimizni interfeyslarga murojaat qilish orqali qurishimiz kerak va shundan keyingina sinflari kerakli interfeysni amalga oshiradigan ushbu funksionallikka aniq ob'ektlarni o'tkazishimiz kerak. Misol uchun, agar bizda Cat interfeysi va uning ba'zi ilovalari, aytaylik, Lion va HomeCat bo'lsa , biz o'zaro ta'sir qilish mantig'imizni maxsus Cat interfeysi turi bilan quramiz va shundan keyingina Lion yoki HomeCat ning o'ziga xos ilovasini almashtiramiz , lekin aksincha emas.

24. Sinf, obyekt, interfeys nima?

Esda tutganimizdek, Java OOP tilidir. Ya'ni, Java dasturlari ob'ektlar orasidagi o'zaro ta'sirga asoslangan. Ma'lum bo'lishicha, dastur chumoli uyasiga o'xshaydi, bu erda har bir chumoli ob'ektdir. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  3-3 qismOb'ektlar - bu ichki ma'lumotlar bilan o'zaro ta'sir qilishning turli usullarini (funktsiyalarini) o'z ichiga olgan ba'zi bir guruhlangan ma'lumotlar. Sinflar esa ob'ektlarni yaratish uchun ko'rsatmalar, shablonlardir. Ya'ni, bir xil ko'rsatma bo'yicha tuzilgan, turli yoki bir xil ma'lumotlar qiymatlari bilan to'ldirilgan ko'plab ob'ektlar bo'lishi mumkin. Hayotdan misol keltirish uchun aytishimiz mumkinki, sinf binoning chizmasi, ob'ekt esa shu chizma asosida maxsus yaratilgan binodir. Interfeyslar sinflarning analoglari bo'lib, ular yordamida ob'ektlarni yaratib bo'lmaydi. Ularning maqsadi Java-ga abstraksiya elementini qo'shishdir. Aniqroq aytganda, sinflar va ob'ektlar o'rtasidagi munosabatlarga moslashuvchanlikni qo'shish. Moslashuvchanlik deganda biz yuqorida tavsiflangan polimorfizm va abstraksiyani tushunamiz, bu esa o'z navbatida ilovaning ichki arxitekturasini yaratish uchun ko'plab imkoniyatlarni ochadi.

25. POJO klassi nima? Bunday sinfga misol keltiring

Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  3-4 qismPOJO - Oddiy Old Java Ob'ekti - yaxshi eski Java ob'ekti: sinfning oddiy ob'ekti, hech qanday maxsus sinfdan meros bo'lib o'tmagan va biznes modeli uchun zarur bo'lganlardan tashqari hech qanday xizmat interfeyslarini amalga oshirmaydi. Boshqacha qilib aytganda , POJO klassi maxsus talablarga ega bo'lmagan sinfdir. Yagona talab - ma'lum bir ramkaga bog'langan turli xil qo'ng'iroqlar va hushtaklarning yo'qligi. Qoida tariqasida, bunday sinflar boshqa sinflardan meros bo'lmaydi ( bir xil paketdagi POJO sinflaridan tashqari), interfeyslarni amalga oshirmaydi - ba'zida Serializable yoki Cloneable kabi standart kutubxonadan marker interfeyslari uchun istisno qilinadi - izohlardan foydalanmang va uchinchi tomon kutubxonalariga bog'liq emas. Ammo shuni ta'kidlaymanki, POJOlar biznes mantig'i va har qanday turdagi konstruktorlar bilan usullarga ega bo'lishi mumkin. Agar siz sinfning semantikasiga o'zgartirish kiritmaydigan izohlarga ruxsat bersangiz (ularsiz ob'ektning maqsadi va uning ishlash mantig'i o'zgarmaydi), POJOlar JPA ob'ektlari va XML yoki JSON dan seriyadan chiqarilgan DTO ob'ektlarini ham o'z ichiga olishi mumkin . qoidalari izohlarda ko'rsatilgan. Shuningdek, POJO sinflari uchun teng va hashCode ni bekor qilish tavsiya etiladi , chunki bu ularning rolini yaxshiroq bajarishiga yordam berishi mumkin. POJO sinfiga misol :
public class User {
   private Long id;
   private String firstName;
   private String lastName;
   private Long age;

   public User(final Long id, final String firstName, final String lastName, final long age) {
       this.id = id;
       this.firstName = firstName;
       this.lastName = lastName;
       this.age = age;
   }

   public Long getId() {
       return this.id;
   }

   public String getFirstName() {
       return this.firstName;
   }

   public String getLastName() {
       return this.lastName;
   }

   public Long getAge() {
       return this.age;
   }

   @Override
   public boolean equals(final Object o) {
       if (this == o) return true;
       if (o == null || this.getClass() != o.getClass()) return false;
       final User user = (User) o;
       return Objects.equals(this.id, user.id) &&
               Objects.equals(this.firstName, user.firstName) &&
               Objects.equals(this.lastName, user.lastName) &&
               Objects.equals(this.age, user.age);
   }

   @Override
   public int hashCode() {
       return Objects.hash(this.id, this.firstName, this.lastName, this.age);
   }
}

26. Sinf qanday elementlarni o'z ichiga olishi mumkin?

Sinf quyidagi elementlarni o'z ichiga olishi mumkin:
  • sinf maydonlari;
  • statik sinf maydonlari;
  • ishga tushirish bloki;
  • statik ishga tushirish bloki;
  • konstruktorlar (bo'sh har doim sukut bo'yicha aniqlanadi);
  • usullari;
  • statik usullar;
  • turli xil izohlar (ular sinfning o'zi yoki uning tarkibiy qismlari ustida osilishi mumkin);
  • generiklar ;
  • boshqa sinflardan meros ( kengaytirish ) yoki interfeyslardan ( apparatlardan ) amalga oshirish.

27. Java tilidagi merosni tushuntiring. Super kalit so'zdan foydalanishning qanday afzalliklari bor?

Yuqorida men Java-da meros va super kalit so'z haqida gapirgan edim . Yana bir nechta muhim fikrlarni aytib o'taman:
  1. Faqat bitta sinfni meros qilib olish mumkin: Java-da bir nechta meros yo'q (lekin Java 8-da standart usullarning paydo bo'lishi bilan bu bayonot juda bahsli bo'lib qoladi).
  2. Xususiy usullar va maydonlar ham meros bo'lib, ularga merosxo'r tomonidan kirish imkoni bo'lmaydi (lekin, masalan, bizda shaxsiy maydon bo'lsa va u uchun umumiy yoki himoyalangan oluvchilar va sozlashchilar mavjud bo'lsa, maydon bilan ishlash mumkin. ular orqali).
  3. yakuniy sinflar meros qilib olinmaydi.
  4. yakuniy usullar bekor qilinmaydi (lekin ular meros qilib olinishi va ortiqcha yuklanishi mumkin).
  5. statik usullar va o'zgaruvchilar meros qilib olinmaydi (chunki ular ob'ektlarga emas, balki sinflarga bog'langan).
  6. Abstrakt sinflardan meros bo'lganda, ularning mavhum usullarini amalga oshirish talab qilinadi yoki joriy sinf ham mavhum deb e'lon qilinishi kerak.
  7. Agar ota-onada standart bo'lmagan konstruktorlar mavjud bo'lsa, ular bolalar sinfida bekor qilinishi kerak (lekin ularning ustiga @Override yozilmagan).
  8. Avloddagi bekor qilingan usullar kirish modifikatori bilan kengaytirilishi mumkin: private -> default -> protected -> public .
  9. Avloddagi bekor qilingan usullar yozilgan istisnolarni qisqartirishi mumkin, masalan: Exception -> IOException -> FileNotFoundException.
Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  3-5 qism

28. Usul imzosi nima? To'g'ri va noto'g'ri imzolarga misollar keltiring

Usulning imzosi - bu usulning nomi va kiruvchi parametrlarning turlari (va parametrlarning tartibi muhim). Usul imzosi qaytarish qiymatini yoki u chiqaradigan istisnolarni o'z ichiga olmaydi. To'g'ri imzoga misol:
doSomething(int, double, double)
Noto'g'ri imzoga misol:
void doSomething(int firstArg, int secondArg) throws Exception
Qaytish turi va tashlanadigan istisnolar ro'yxati bilan birlashtirilgan usul imzosi usul shartnomasi deb ataladi . Bugun hammasi shu. Ko'rishguncha!Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  3-6 qism
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION