Hammaga salom, bugun men Java dasturchisi uchun 250+ intervyu savollarini tahlil qilishni davom ettiraman. Tahlilning oldingi qismlari: birinchi , ikkinchi , uchinchi . Shunday ekan, davom etaylik.
<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 :
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 .
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
public final class Lion extends Cat implements WildAnimal
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
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);
}
}
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:
- this() faqat konstruktorda ishlaydi.
- Boshqa konstruktorga havola konstruktor blokining (tanasi) birinchi qatorida bo'lishi kerak. Shuning uchun bitta konstruktorda berilgan sinfning bir nechta (boshqa) konstruktorlarini chaqirish mumkin emas.
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 . Keyinchalik, 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:- Parent sinfining statik maydonlari .
- Ota- klass uchun statik ishga tushirish bloki .
- Child sinfining statik maydonlari .
- Child sinfi uchun statik ishga tushirish bloki .
- Parent sinfining statik bo'lmagan maydonlari .
- Ota- klass uchun statik ishga tushirish bloki emas .
- Ota-onalar sinfi uchun konstruktor .
- Child sinfining statik bo'lmagan maydonlari .
- Child sinfi uchun statik ishga tushirish bloki emas .
- Bolalar sinfi konstruktori .
37. Sinflar (ob'ektlar) o'rtasidagi qanday munosabatlarni bilasiz?
Java-da sinflar o'rtasidagi munosabatlarning ikki turi mavjud:- IS-A munosabatlari
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
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, kompozitsiya 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.
GO TO FULL VERSION