Hər kəsə salam, bu gün mən Java tərtibatçısı üçün 250+ müsahibə sualını təhlil etməyə davam edirəm . Təhlilin əvvəlki hissələri: birinci , ikinci , üçüncü . Beləliklə, davam edək.
<sinif adı>{Valideyn sinifindən miras} {interfeys tətbiqi}
Beləliklə, bizdə nə var: {class access modifier} - yalnız ictimai dəyişdiricilər və çatışmayan giriş modifikatoru, yəni default , sinif üçün mövcuddur . {class static} - statik bu sinfin statik olduğunu göstərən dəyişdiricidir, yalnız daxili siniflərə (digər siniflər daxilindəki siniflər) aid edilir. {sinif sonluğu} - xatırladığımız kimi, bu , sinifin irsi olmayan hala gəldiyi son dəyişdiricidir (qutudan nümunə - String ). {sinf abstraksiya} - dəyişdirici - abstrakt , bu sinfin həyata keçirilməmiş metodlara malik ola biləcəyini göstərir. Bu dəyişdirici son dəyişdirici ilə ziddiyyət təşkil edir , yəni onlardan yalnız biri sinif başlığında ola bilər, çünki mücərrəd dəyişdirici verilmiş sinfin miras alınacağını və onun mücərrəd hissələrinin həyata keçiriləcəyini nəzərdə tutur. Və final göstərir ki, bu, sinfin son (son) versiyasıdır və miras alına bilməz. Əslində, hər iki dəyişdiricidən eyni vaxtda istifadə etmək absurd olardı və tərtibçi bunu etməyə imkan verməyəcək. <class> sinif bəyannaməsini göstərən tələb olunan açar sözdür. <sinif adı> xüsusi Java sinifinin identifikatoru olan sadə sinif adıdır. Tam uyğunlaşdırılmış sinif adı tam uyğunlaşdırılmış paket adından + ibarətdir. + sadə sinif adı. {Valideyn sinifindən miras} - extensions açar sözündən istifadə edərək ana sinifin (əgər varsa) təyin edilməsi . Məsələn, .. ParentClass-ı genişləndirir . {interfeys tətbiqi} - bu sinfin həyata keçirdiyi interfeysləri (əgər varsa) implements açar sözündən istifadə etməklə təyin etmək . Məsələn: ... FirstInterface, SecondInterface tətbiq edir ... Yaxşı, sinif başlığına misal olaraq, Cat- dan miras qalan və WildAnimal interfeysini həyata keçirən Lion sinifinin başlığını nəzərdən keçirin :
29. Konstruktorda return istifadə etmək mümkündürmü?
Siz edə bilərsiniz, ancaq qaytarılma dəyəri olmadan geri qaytarma hüququ . Yəni, siz qaytarmaqdan istifadə edə bilərsiniz; sonrakı kodun icrasını təcili olaraq başa çatdırmaq (aralamaq) və obyektin işə salınmasını başa çatdırmaq üçün konstruktorda hesablamalar zamanı köməkçi tikinti kimi. Məsələn, bizim bir sinifimiz var Pişik , və əgər Pişik evsizdirsə - isHomeless = true , biz işə salmağı bitirməli və digər sahələri doldurmamalıyıq (hər şeydən sonra, pişik evsiz olduğundan onlar bizə məlum deyil):public Cat(int age, String name, boolean isHomeless) {
if (isHomeless){
this.isHomeless = isHomeless;
return;
}
this.isHomeless = isHomeless;
this.age = age;
this.name = name;
}
Ancaq konkret dəyərlərə gəldikdə, konstruktor dəyəri qaytarmaq üçün return istifadə edə bilməz, çünki:
- konstruktoru elan edərkən geri dönüş növünə bənzər bir şey olmayacaq;
- Tipik olaraq, konstruktor instantiasiya zamanı gizli çağırılır;
- Konstruktor metod deyil: o, yeganə məqsədi nümunə dəyişənlərini işə salmaq olan ayrıca mexanizmdir və yeni operator obyektin yaradılmasına cavabdehdir .
30. Konstruktordan istisna atmaq olarmı?
Konstruktorlar istisnalarla üsullarla eyni şəkildə məşğul olurlar. Əgər metodlar metodun başlığına <ExceptionType> atışlarını yazmaqla istisnalar atmağa imkan verirsə , o zaman konstruktor bizə bunu etməyə imkan verir, həmçinin varis konstruktorunu miras alarkən və müəyyən edərkən biz istisna tipini genişləndirə bilərik. Məsələn, IOException -> İstisna (lakin əksinə deyil). Konstruktor tərəfindən bir istisnanın atılmasına misal olaraq, Cat sinfini götürək . Deyək ki, onu yaratarkən konsoldan ad və yaş daxil etmək istəyirik: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 atdığından , biz onu mümkün atılan istisna kimi başlıqda qeyd edirik.
31. Sinif başlığı hansı elementlərdən ibarətdir? Bir nümunə yazın
Sinif başlığını təşkil edən elementlərdən danışarkən kiçik diaqrama baxaq:- məcburi komponentlər mötərizədə <> olacaq
- isteğe bağlı - {} daxilində
public final class Lion extends Cat implements WildAnimal
32. Metod başlığı hansı elementlərdən ibarətdir? Bir nümunə yazın
Yenə də metod başlığını təşkil edən elementlərə baxarkən kiçik diaqramı nəzərdən keçirin, burada:- məcburi komponentlər mötərizədə <> verilir
- isteğe bağlı - {} daxilində
public static void main(String[] args) throws IOException
33. Əsas obyektdə müəyyən edilməyibsə, nəsil obyektdə defolt konstruktor yaradın (lakin başqa konstruktor müəyyən edilib)
Sualın özünü tam başa düşmürəm, amma bəlkə də bu o deməkdir ki, məsələn, valideyndə bəzi xüsusi konstruktorumuz var:public Cat(int age, String name) {
this.age = age;
this.name = name;
}
Buna görə də, əcdad sinfində mütləq ana konstruktoru dolduracaq (zəng edəcək) konstruktoru müəyyən etməliyik:
public class Lion extends Cat {
public Lion(int age, String name) {
super(age, name);
}
}
34. this açar sözü nə vaxt istifadə olunur?
Java-da bunun iki fərqli mənası var. 1. Cari obyektə istinad olaraq, bu kimi.yaş = 9 . Yəni bu , çağırıldığı obyektə və bunu istifadə edən kodun istinad etdiyi obyektə aiddir . Əsas funksiya kodun oxunmasını artırmaq və qeyri-müəyyənliyin qarşısını almaqdır. Məsələn, daxili sinif sahəsinin adı və metod arqumenti eynidirsə:public void setName(String name) {
this.name = name;
}
Yəni this.name obyekt adının sahəsidir metod arqumentidir.Bu istinad statik metodlarda istifadə edilə bilməz. 2. this (value) kimi metod çağırışı şəklində konstruktorda istifadə edilə bilər . Bu vəziyyətdə, eyni sinifdən başqa bir konstruktora zəng olacaq. Bir sözlə, obyekt yaratarkən eyni anda iki konstruktor çağıra bilərsiniz:
public Cat(int age, String name) {
this(name);
this.age = age;
}
public Cat(String name) {
this.name = name;
}
Cat obyekti yaradıldıqda və ilk konstruktor çağırıldıqda, obyektin hər iki sahəsi çağırılacaq və uğurla işə salınacaq. Bir neçə nüans var:
- this() yalnız konstruktorda işləyir.
- Konstruktor blokunun (gövdəsinin) birinci sətirində başqa konstruktora istinad olmalıdır. Buna görə də, verilmiş sinfin birdən çox (digər) konstruktorunu bir konstruktorda çağırmaq olmaz.
35. İnisializator nədir?
Anladığım qədər, bu sualda söhbət adi və statistik başlanğıc bloklarından gedir. Əvvəlcə inisializasiyanın nə olduğunu xatırlayaq. İnisiallaşdırma yaradılması, aktivləşdirilməsi, işə hazırlıq, parametrlərin müəyyən edilməsidir. Proqramın və ya komponentin istifadəyə hazır vəziyyətə gətirilməsi. Xatırladığınız kimi, obyektin yaradılması zamanı sinif dəyişəni birbaşa elan edildikdən sonra işə salına bilər:class Cat {
private int age = 9;
private String name = "Tom";
Və ya konstruktor vasitəsilə onu xaricdən təyin edin:
class Cat {
private int age;
private String name;
public Cat(int age, String name) {
this.age = age;
this.name = name;
}
Ancaq başqa bir yol da var: sinif daxilində buruq mötərizələrə bənzəyən (metod və ya konstruktor kimi) inisializasiya bloku vasitəsilə daxili obyekt dəyişənini təyin etmək:
class Cat {
private int age;
private String name;
{
age = 10;
name = "Tom";
}
Yəni inisializasiya bloku obyekt yaradılan zaman yüklənən kod parçasıdır. Tipik olaraq, bu cür bloklar sinfi yükləyərkən zəruri olan bəzi mürəkkəb hesablamaları yerinə yetirmək üçün istifadə olunur. Bu hesablamaların nəticələri dəyişənlər üçün dəyərlər kimi təyin edilə bilər. Həmçinin, müntəzəm başlatma bloklarına əlavə olaraq, eyni görünən, lakin əyri mötərizədən əvvəl statik açar sözü olan statik bloklar var :
class Cat {
private static int age;
private static String name;
static{
age = 10;
name = "Tom";
}
Bu blok əvvəlki ilə tamamilə eynidir. Ancaq hər bir obyekt işə salındıqda adi obyekt işə salınarsa, statik olan yalnız bir dəfə, sinif yükləndikdə işə düşəcək. Belə bir blokda, bir qayda olaraq, statik sinif dəyişənlərinin sonradan işə salınması üçün bəzi mürəkkəb hesablamalar da aparılır. Eyni məhdudiyyətlər statik blok üçün statik metodlara aiddir: o, qeyri-statik məlumatlardan, eləcə də cari obyektə istinaddan istifadə edə bilməz - bu . Bundan sonra, başlanğıc bloklarının işə salındığı anı daha yaxşı başa düşmək üçün sinfin (əcdadı ilə birlikdə) işə salınma sırasını görə bilərik.
36. Sinif ictimai sinifini miras almaq üçün Child extensions Parent, obyektin inisializasiya sırasını yazın.
Uşaq sinfi yükləndikdə, işə salma qaydası aşağıdakı kimi olacaq:- Ana sinifin statik sahələri .
- Ana sinif üçün statik başlatma bloku .
- Uşaq sinifinin statik sahələri .
- Uşaq sinfi üçün statik başlatma bloku .
- Ana sinifin qeyri-statik sahələri .
- Ana sinif üçün statik başlatma bloku deyil .
- Ana sinif üçün konstruktor .
- Uşaq sinifinin qeyri-statik sahələri .
- Uşaq sinfi üçün statik başlatma bloku deyil .
- Uşaq sinfinin konstruktoru .
37. Siniflər (obyektlər) arasında hansı əlaqələri bilirsiniz?
Java-da siniflər arasında iki növ əlaqə var:- IS-A əlaqəsi
Lion IS-A Cat
(lakin hər Pişik Aslan deyil ) İnterfeyslərdə vəziyyət tam olaraq eynidir. Əgər Lion sinfi WildAnimal interfeysini tətbiq edirsə , onda onlar da əlaqədədirlər:
Lion IS-A WildAnimal
- HAS-A əlaqələri
Car HAS-A Passenger
Və əksinə: əgər Sərnişinin Avtomobilə istinadı varsa , bu əlaqə olacaq:
Passenger HAS-A Car
38. Cisimlər arasında hansı assosiativ əlaqələri bilirsiniz?
Aqreqasiya və tərkib birləşmənin xüsusi hallarından başqa bir şey deyil. Aqreqasiya bir obyektin digərinin bir hissəsi olduğu münasibətdir. Məsələn, bir sərnişin avtomobildə ola bilər. Həmçinin, bir neçə sərnişin ola bilər və ya ümumiyyətlə olmaya bilər (əgər biz Tesladan danışırıqsa, sürücü tələb olunmur). Misal üçün: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();
}
}
Yəni, sərnişinlərin sayı (və ya ümumiyyətlə olub-olmaması) bizi maraqlandırmır: Avtomobil sinifinin funksionallığı bundan asılı deyil. Aqreqasiya həm də o deməkdir ki, bir obyekt başqa bir obyekt tərəfindən istifadə edildikdə, birincisi digər obyektlərdə istifadə edilə bilər. Məsələn, eyni tələbə həm trikotaj klubunun, həm də rokçuların musiqi qrupunun üzvü ola bilər və eyni zamanda ingilis dili öyrənənlər qrupuna gedə bilər. Anladığınız kimi, aqreqasiya siniflər arasında daha sərbəst assosiativ əlaqədir. Kompozisiya, bir obyektin yalnız başqa bir obyektin bir hissəsi olmadığı, digər obyektin işi birincidən çox asılı olduğu zaman daha sərt bir əlaqədir. Məsələn, bir avtomobil mühərriki. Mühərrik avtomobilsiz mövcud olsa da, onun xaricində faydasızdır. Yaxşı, bir avtomobil mühərriksiz işləyə bilməz:
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
void startMoving() {
engine.start();
...
}
Kompozisiya həmçinin nəzərdə tutur ki, bir obyekt başqa bir obyekt tərəfindən istifadə edildikdə, birincisi başqasına aid ola bilməz. Nümunəmizə qayıtsaq, bir mühərrik yalnız bir avtomobilə aid ola bilər, eyni zamanda iki və ya daha çox avtomobilə aid ola bilməz. Yəqin ki, bu gün burada dayanacağıq.
GO TO FULL VERSION