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

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

Guruhda nashr etilgan
Salom salom! Bugungi kunda Java dasturchilariga talab katta. Albatta, men sizga bo'sh ish o'rni bilan ta'minlay olmayman, lekin siz yangi bilimlarga ega bo'lishingiz va bo'shliqlarni yopishingiz uchun sizga ozgina yordam berishga harakat qilaman. Shunday qilib, biz Java dasturchisi uchun 250+ intervyu savollarini tahlil qilishda davom etamiz . Tahlilning oldingi qismlariga havolalar maqolaning oxirida.Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  5-1-qism

39. Java tilidagi kirish modifikatorlari nima? Ularga nom bering. Ular nima uchun ishlatiladi?

Men ilgari Java inkapsulyatsiya elementlari haqidagi savolda kirish modifikatorlarini tasvirlab bergan edim. Lekin baribir eslataman. Java-dagi kirish modifikatorlari ma'lum bir Java komponentiga berilgan kirish darajasini tavsiflovchi kalit so'zlardir. Kirish modifikatorlari quyidagilar bo'lishi mumkin:
  • public - ushbu modifikatorga ega element hamma uchun ochiq bo'ladi. Bular. maydonlar va usullar, umumiy modifikator bilan e'lon qilingan sinflar joriy paketdan ham, tashqi paketlardan ham boshqa sinflarga ko'rinadi;
  • himoyalangan - ushbu modifikatorga ega bo'lgan elementga joriy paketning joriy sinfidagi yoki avlod sinflarining istalgan joyidan kirish mumkin bo'ladi, hatto ular boshqa paketlarda bo'lsa ham;
  • default , yoki etishmayotgan modifikator - bu modifikator kirish modifikatori umuman ko'rsatilmaganda bilvosita ishlatiladi. Bu avvalgisiga o'xshaydi, faqat boshqa paketlardagi avlod sinflarida ko'rinishga ruxsat beriladi;
  • private barcha modifikatorlar ichida eng maxfiy bo'lib, elementga faqat joriy sinf ichida kirish imkonini beradi.
Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  5-2-qism

40. Statik va o‘zgaruvchan usullarning asosiy xususiyatini ayting

Juda g'alati formula - "o'zgaruvchan usullar". Albatta, bu oddiy, statik bo'lmagan usullarga tegishli. Demak, asosiy farq shundaki, statik usullar sinfga tegishli va aslida ular uchun bu klassning namunasini yaratish shart emas: uni faqat sinf turi yordamida chaqirish mumkin. Masalan, bizda mushukni erkalashning statik usuli bor:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
Uni chaqirish uchun bizga CatService sinfining namunasi kerak emas :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
Oddiy usullar ob'ektga bog'langan (tegishli) bo'lsa va ularni chaqirish uchun sizda usul chaqiriladigan misol (ob'ekt) bo'lishi kerak. Masalan, mushukning statik bo'lmagan usuli bor - miyovlash:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
Ushbu usulni chaqirish uchun bizga mushukning ma'lum bir misoli kerak:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. Statik va “o‘zgaruvchan” usullarning asosiy cheklovlari nimalardan iborat?

Yuqorida aytib o'tganimdek, oddiy usulning asosiy cheklovi shundaki, har doim usul chaqiriladigan ba'zi bir misol bo'lishi kerak. Ammo statik usul buni talab qilmaydi, lekin u ushbu havolaga - joriy ob'ektning elementlariga murojaat qila olmaydi - chunki joriy ob'ekt u uchun mavjud emas.

42. Static kalit so‘zi nimani anglatadi? Statik usulni bekor qilish yoki ortiqcha yuklash mumkinmi?

Static kalit so'zi bilan belgilangan element sinf ob'ektiga emas, balki sinfga tegishli bo'lib, u sinfning o'zi yuklanganda yuklanadi. Statik elementlar butun dastur uchun yagona, oddiy elementlar esa ma'lum bir ob'ekt uchun yagonadir. Statik bo'lishi mumkin:
  • sinf maydonlari;
  • sinfni ishga tushirish bloki;
  • sinf usuli;
  • sinfning ichki sinflari (ammo bu hali ham tavtologiya).
Statik usulni bekor qilib bo'lmaydi: u sinfga tegishli va meros qilib olinmaydi, lekin ayni paytda uni ortiqcha yuklash mumkin.

43. Usul bir vaqtning o'zida statik va mavhum bo'lishi mumkinmi?

Men buni oldingi maqolada aytib o'tgan edim: usul bir vaqtning o'zida mavhum va statik bo'lishi mumkin emas. Usulning mavhumligi uning vorisda bekor qilinishi kerakligini anglatadi. Shu bilan birga, statik usul sinfga tegishli bo'lib, uni bekor qilib bo'lmaydi: bu ziddiyatga olib keladi, uni kompilyator ko'radi va la'natlashni boshlaydi. Agar sizda shunday vaziyat bo'lsa, arizangiz arxitekturasining to'g'riligi haqida jiddiy o'ylab ko'rishingiz kerak (oxir-oqibat, unda biron bir noto'g'ri narsa bor).Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  5-3-qism

44. Muntazam usullarning o'rtasida statik usullarni qo'llash mumkinmi? Aksincha? Nega?

Oddiy usullarda statik usullardan foydalanish mumkin, chunki bunga hech narsa to'sqinlik qilmaydi. Shu bilan birga, teskari vaziyat bo'lishi mumkin emas: statik usul ushbu sinfning ma'lum bir misoliga havolasiz oddiy usuldan foydalana olmaydi. Va biz eslaganimizdek, bu havola statik sinf a'zolari uchun mavjud emas: sinfning o'ziga xos ob'ektlari siz xohlagancha ko'p bo'lishi mumkin va ularning har biri ichida o'ziga havola bo'ladi - bu . Xo'sh, qaysi havolani olishingiz kerakligini qanday tushunasiz ? Lekin yo'q. Shuning uchun, statik elementlar ma'lum bir ob'ektga havolasiz, statik bo'lmagan elementlarga murojaat qila olmaydi. Aslida, statik usul faqat ma'lum bir ob'ektga havola bo'lsa, statik bo'lmagan usuldan foydalanishi mumkin. Masalan, argument sifatida kelgan:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
Bu erda biz petTheCat statik usuli Cat ob'ektining oddiy, statik bo'lmagan usulini chaqirishini ko'ramiz - getName .

45. Interfeys nima? Yakuniy interfeys bo'lishi mumkinmi?

Esda tutganimizdek, Java-da bir nechta meros yo'q. Interfeyslar unga muqobil narsadir. Interfeys juda yaroqsiz sinfga o'xshaydi. Ular ushbu interfeyslarni amalga oshiradigan (amalga oshiruvchi) sinflar tomonidan amalga oshiriladigan ma'lum bir amalga oshirishsiz funksionallikni belgilaydi. Interfeys misoli:
public interface Animal {
    void voice();
}
Sinf tomonidan interfeysni amalga oshirishga misol:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Interfeyslardan foydalanish haqida bilishingiz kerak bo'lgan asosiy narsa:
  1. Interfeys usullari faqat sarlavhani o'z ichiga olishi kerak, ma'lum bir usul tanasisiz, ya'ni. mavhum bo'lishi kerak (lekin mavhum kalit so'zdan foydalanmasdan ). Bunga istisno statik va standart usullar bo'lib, ular usul tanasini talab qiladi.
  2. Sinf ko'plab interfeyslarni amalga oshirishi mumkin (aytganimdek, bu ko'p merosga muqobil), ular vergul bilan ajratilgan: sinf Lion Animal, Wild ni amalga oshiradi .
  3. Interfeyslar kalit so'z - interfeys yordamida yaratiladi .
  4. Sinf tomonidan interfeysni amalga oshirayotganda, kalit so'z implements bo'ladi .
  5. Muayyan interfeysni amalga oshiradigan sinf uning barcha mavhum usullarini amalga oshirishi yoki o'zini mavhum deb e'lon qilishi kerak.
  6. Interfeyslardan foydalanishning asosiy maqsadi polimorfizmni (ob'ektlarning ko'p shakllarni olish qobiliyati) amalga oshirishdir.
  7. Qoidaga ko'ra, usullar uchun kirish modifikatorlari interfeysda yozilmaydi: ular sukut bo'yicha umumiy bo'lib, ommaviydan tashqari boshqa modifikatorlarni ko'rsatib bo'lmaydi. Java 9 dan boshlab usullar uchun shaxsiy modifikatorlardan foydalanishingiz mumkin .
  8. Interfeys o'zgaruvchilari sukut bo'yicha statik yakuniydir , boshqacha qilib aytganda, doimiylar: ular doimo interfeysda to'g'ridan-to'g'ri ishga tushirilishi kerak.
  9. Siz interfeys ob'ektini yarata olmaysiz.
Interfeyslar yakuniy bo'lishi mumkinmi degan savolga javob, albatta, emas. Axir, interfeyslarning mohiyatini amalga oshirish kerak. Va hammamiz yaxshi eslaganimizdek, sinf darajasida yakuniy uni meros qilib bo'lmaydigan qiladi va interfeys bo'lsa, amalga oshirilmaydi. Nima uchun bizga amalga oshirib bo'lmaydigan interfeys kerak? To'g'ri - kerak emas! Va kompilyator shunday deb o'ylaydi)) Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  5-4-qismMa'no faqat Java 8 interfeyslarida statik usullarni joriy qilish bilan paydo bo'ldi, ammo bu interfeys yakuniy bo'lishi mumkin emasligini o'zgartirmadi. Men interfeyslar haqida juda yuzaki gapirdim, chunki ... bu keng mavzu. Bu haqda Java-dagi interfeyslar va mavhum sinflar va interfeyslar o'rtasidagi farq haqida maqolalarda o'qing .

46. ​​Statik maydonlarni qayerda ishga tushirishim mumkin?

Statik maydonlarni ishga tushirish mumkin:
  • to'g'ridan-to'g'ri deklaratsiyada, teng belgisi orqali = ;
  • statik ishga tushirish blokida;
  • statik bo'lmagan ishga tushirish blokida, lekin har safar ob'ekt yaratilganda, bu maydon ushbu ishga tushirish bloki tomonidan yozilishini tushunishingiz kerak;
  • sinf konstruktorida. Har safar ushbu konstruktor chaqirilganda (ya'ni, ushbu konstruktor orqali ob'ekt yaratilganda), bu maydonning ustiga yoziladi;
  • statik usullarda;
  • statik bo'lmagan usullarda;
  • ichki statik va statik bo'lmagan, mahalliy va anonim sinflarda.

47. Anonim sinflar nima?

Anonim sinflar o'z turiga ega bo'lmagan sinflardir. Men nima haqida gapiryapman? Interfeyslar haqida gapirganimizda, men siz interfeys ob'ektini yarata olmasligingizni aytdim: siz faqat interfeysni amalga oshiradigan sinf ob'ektini yaratishingiz mumkin. Agar siz sinfda interfeysni amalga oshirishni xohlamasangiz-chi, lekin siz hali ham interfeys turidagi ob'ektga muhtoj bo'lsangiz? Va, ehtimol, bu ob'ektdan foydalanishning yagona holati bo'ladi. Va to'liq huquqli amalga oshirish sinfini yaratishingiz shart emas. Buni qanday qilasiz? To'g'ri! Anonim sinf orqali! Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  5-5-qismAytaylik, bizda hayvonlar interfeysi mavjud :
public final interface Animal {
   public void voice();
}
Agar biz ushbu interfeysni anonim sinf orqali yaratmoqchi bo'lsak:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
Va keyin siz ushbu ob'ektni va uning amalga oshirilgan usulini xavfsiz ishlatishingiz mumkin - ovoz . Ya'ni, anonim sinf ushbu interfeysni va uning barcha mavhum usullarini shu erda va hozir amalga oshiradi. Aks holda biz interfeys/mavhum sinf obyektini yarata olmaymiz, chunki amalga oshirilmagan/mavhum usullar mavjud. Yuqorida aytib o'tganimdek, anonim sinflar interfeysning mavhum usullarini amalga oshirish uchungina emas, balki mavhum sinfning mavhum usullarini amalga oshirish uchun ham qo'llaniladi. Ushbu yondashuv ob'ekt bir martalik ishlatiladigan yoki usullarning ma'lum bir amalga oshirilishi faqat bir marta kerak bo'lgan holatlar uchun yaxshi bo'ladi va kerakli mavhum sinfni/interfeysni amalga oshiradigan alohida sinf yaratishga hojat yo'q. Ammo shuni ham ta'kidlab o'tamanki, anonim sinflardan foydalanish ishda kam uchraydigan hodisa: qoida tariqasida, hali ham oddiy sinflarga ustunlik beriladi. Anonim sinflar haqida ko'proq ma'lumotni ushbu maqolada o'qishingiz mumkin .

48. Ibtidoiy sinflar nima?

Menga kelsak, bu juda g'alati savol va, ehtimol, bu tuzoq savol, chunki Java-da ibtidoiy sinflar degan narsa yo'q: ehtimol biz ilgari ko'rib chiqqan ibtidoiy tiplar tushunchasidan tashqari. Esda tutganimizdek, Java-da 8 ta ibtidoiy tip mavjud - bayt , short , int , long , float , double , char , boolean .Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  5-6-qism

49. “O‘ram” sinfi nima?

Java-da ibtidoiy turlardan foydalanishning asosiy muammosi shundaki, ular hali ham sinflar emas va Java hali ham OOP tilidir. Ya'ni, bu tilda yozilgan dasturlar ob'ektlar orasidagi o'zaro ta'sirga qisqartiriladi. Xo'sh, ibtidoiylar ob'ektlar emas. Ularning usullari, hatto Object sinfidagi standart usullari ham yo'q . Xo'sh, agar Map'da kalit sifatida primitivdan foydalanish kerak bo'lsa-chi ? Keyin hashCode usulini chaqirishingiz kerak . U erda tenglar usulini ham chaqirishingiz mumkin . Keyin nima? Dasturda primitivlarni foydalanilmaydigan va nomaqbul elementlarga aylantiradigan ibtidoiy emas, balki sinf bo'lishi kerak bo'lgan juda ko'p lahzalar bo'lishi mumkin, chunki bu OOP g'oyasini buzadi. Ammo hamma narsa ko'rinadigan darajada yomon emas. Axir, Java-da ibtidoiy o'rash tushunchasi mavjud. Har bir ibtidoiy turdagi analog sinf mavjud:
  • bayt -> Byte.class
  • short -> Short.class
  • int -> Integer.class
  • long -> Long.class
  • float -> Float.class
  • double -> Double.class
  • char -> Belgilar.sinf
  • boolean -> Boolean.class
Bu oddiy turlarning ko'rinishi, ammo turli xil va funktsional usullar to'plamiga ega to'liq huquqli sinflar shaklida. Ushbu sinflardan qulay foydalanish uchun avtoboks va unboxing tushunchalari kiritildi. Autoboxing - agar kerak bo'lsa, ibtidoiy turni avtomatik ravishda analog sinfga aylantirish (masalan, int to Integer ). Qutini ochish avvalgisining teskari jarayonidir: ibtidoiy o'rash sinfini avtomatik ravishda ibtidoiy turga aylantirish (masalan, Integer to int ). Ibtidoiy o'rash sinflari va avtobokslash va qutidan chiqarish jarayonlarining joriy etilishi tufayli ibtidoiy turlar OOP tili - Java ning to'liq huquqli a'zolariga aylanishga muvaffaq bo'ldi. Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  5-7 qismUshbu mavzu haqida ko'proq bilish uchun men ushbu maqolani o'qishni tavsiya qilaman .

50. Nested sinf nima? Qachon ishlatiladi?

Ichki sinf - bu boshqa sinfning a'zosi bo'lgan ichki sinf. Java-da bunday ichki sinflarning 4 turi mavjud: 1. Ichki sinf Bu turdagi sinf to'g'ridan-to'g'ri boshqa sinfning tanasida e'lon qilinadi. Ichki ichki sinf har qanday shaxsiy maydonga yoki tashqi sinf misolining usuliga kirishi mumkin. Misol tariqasida, hayvon - zebra bo'ladigan hayvonot bog'ini yarataylik:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Hech qanday murakkab narsa yo'q, to'g'rimi? Keling, ichki sinf ob'ektini yaratish misolini ko'rib chiqaylik:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
Siz allaqachon ko'rganingizdek, ramkalash sinfining ob'ektini yaratish juda muhim, unga asoslanib siz ichki sinf ob'ektini yaratishingiz mumkin. Shuni ham ta'kidlashni istardimki, ichki o'rnatilgan ichki sinfda statik usullar yoki statik maydonlar bo'lishi mumkin emas. Buning sababi shundaki, ichki sinf o'zining tashqi sinfining ob'ekti bilan bevosita bog'langan va u o'zida hech qanday statik usullarni e'lon qila olmaydi. 2. Statik ichki o'rnatilgan sinflar Bu sinf avvalgisiga o'xshaydi, faqat u sinf deklaratsiyasi yonida statik kirish modifikatoriga ega. Bunday sinf tashqi sinfning statik bo'lmagan maydonlariga kirish imkoniga ega emasligi sababli, u ichki sinfdan ko'ra tashqi sinfning statik qismiga o'xshaydi. Bunday holda, sinf ma'lumotlari tashqi sinfning barcha statik a'zolariga, hatto xususiylarga ham kirish huquqiga ega. Statik o'rnatilgan sinfga misol:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Yaratish usuli avvalgisidan biroz farq qiladi:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
Bu erda ichki statik sinf ob'ektini yaratish uchun bizga tashqi sinf ob'ekti kerak emas. Tashqi sinfdan bizga faqat uning turi kerak, shunda biz o'rnatilgan sinfning joylashishini topamiz. 3. Lokal sinflar Lokal sinflar - bu metod tanasi ichida e'lon qilingan sinflar bo'lib, mahalliy sinf ob'ektini yaratish va foydalanish faqat shu metod doirasida mumkin. Misol:
public class Zoo {
   public void toFeed(String animal, String food) {
       switch(animal){
           case "зебра":
               class Zebra {
                   void toFeedZebra(String food) {
                       System.out.println("Дать зебре - " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.toFeedZebra(food);
               ...
Foydalanish misoli:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
toFeed usuli uchun kodni ko'rmasdan , siz hatto mahalliy sinf mavjudligiga shubha qilmaysiz, shunday emasmi? Mahalliy sinf statik yoki vaqtinchalik bo'lishi mumkin emas, lekin u mavhum yoki yakuniy sifatida belgilanishi mumkin (faqat YOKI, chunki bu ikki modifikatordan foydalanish ziddiyatga olib keladi). 4. Anonim sinflar Biz yuqorida anonim sinflar haqida gapirgan edik va esingizda bo'lsa, ular ikkita manbadan - interfeyslar va sinflardan yaratilishi mumkin. Ichki statik va statik bo'lmagan sinflardan foydalanish sabablaridan foydalaniladi, chunki ba'zida kichik sinflarni kattaroq sinflarga joylashtirish va ularni bir joyga qo'yish yaxshiroqdir: bunda ular yuqori birlik va umumiy maqsadga ega bo'ladi. Aslida, ichki o'rnatilgan sinflardan foydalanish kod inkapsulyatsiyasini oshiradi. Mahalliy sinflarni tanlashning sababi shundaki, ma'lum bir sinf faqat bitta usulda qo'llaniladi. Bunday holda, kodni dastur bo'ylab tarqatish kerakmi? Yo'q. Ammo shu bilan birga men o'z amaliyotimda mahalliy darslardan foydalanishni hech qachon ko'rmaganman, chunki ularga bo'lgan ehtiyoj juda ziddiyatli. Xo'sh, anonim sinflardan foydalanishning sababi shundaki, interfeys yoki mavhum sinfning ma'lum bir amalga oshirilishi faqat bir marta kerak bo'ladi, shuning uchun buning uchun ilova bilan alohida, to'liq huquqli sinf yaratish kerak emas. Buning o'rniga, oddiy tarzda, biz anonim sinf orqali o'zimizga kerak bo'lgan usul(lar)ni amalga oshirdik, bu ob'ektdan foydalandik va u haqida unutdik (yaxshi, axlat yig'uvchi bu haqda esladi). Ushbu va ushbuJava dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  5-8-qism maqola sizga ichki sinflarni batafsilroq o'rganishga yordam beradi .

51. Sinf qanday kirish modifikatorlariga ega bo'lishi mumkin?

Esda tutganimizdek, sinflarning har xil turlari mavjud va ular uchun turli xil kirish modifikatorlari qo'llaniladi:
  • tashqi sinf kirish modifikatori ochiq bo'lishi yoki modifikatorsiz bo'lishi mumkin (standart modifikator);
  • ichki sinf barcha 4 ta kirish modifikatorlarini qo'llab-quvvatlaydi;
  • ichki o'rnatilgan statik sinf himoyalangandan tashqari barcha kirish modifikatorlarini qo'llab-quvvatlaydi , chunki bu modifikator merosni nazarda tutadi, bu sinfning statik a'zosiga zid keladi (statik elementlar meros qilib olinmaydi);
  • mahalliy sinf faqat standart modifikatorga ega bo'lishi mumkin (ya'ni, umuman modifikator yo'q);
  • anonim sinf : agar sinf turi deklaratsiyasi bo'lmasa, unda kirish modifikatorlari umuman yo'q.
Mana bugun biz to'xtab qolamiz. Ko'rishguncha!Java dasturchisi uchun intervyudan olingan savollar va javoblarni tahlil qilish.  5-9-qism
Seriyadagi boshqa materiallar:
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION