JavaRush /Java Blogu /Random-AZ /Java tərtibatçısı üçün müsahibələrdən alınan sualların və...

Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili. 4-cü hissə

Qrupda dərc edilmişdir
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 . Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  4-cü hissə - 1Təhlilin əvvəlki hissələri: birinci , ikinci , üçüncü . Beləliklə, davam edək.

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 .
Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  4-2 hissə

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ə
{sinif girişi dəyişdiricisi}{class staticity}class finality}{class abstraction} <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 :
public final class Lion extends Cat implements WildAnimal
Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  4-3-cü hissə

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ə
{giriş dəyişdiricisi}{metod static}metod abstraksiya}metod finality}sinxronizasiya dəyişdiricisi} {doğma dəyişdirici}qaytarma dəyəri><metod adı> <(> {metod arqumentləri} <)>{atılmış istisnalar} {giriş dəyişdiricisi } — metod üçün bütün giriş modifikatorları mövcuddur: ictimai , qorunan , default , özəl . {metod static} - statik bu metodun statik olduğunu, yəni obyektə deyil, sinifə bağlı olduğunu göstərən dəyişdiricidir. {metod abstraction} mücərrəd dəyişdiricidir və bu metodun tətbiqinin (gövdəsinin) olmadığını göstərir. Düzgün işləmək üçün metodun təqdim olunduğu sinif üçün mücərrəd dəyişdirici də lazımdır . Sinif başlığında olduğu kimi, bu dəyişdirici son dəyişdirici ilə ziddiyyət təşkil edir , lakin ona əlavə olaraq, statik dəyişdirici ilə də ziddiyyət təşkil edir , çünki mücərrəd metod nəsildə metodun üstünlüyünü nəzərdə tutur və statik metodlar ləğv edilmir. {metodun sonluğu} - final - bu metodun ləğv edilə bilməyəcəyini göstərən dəyişdirici. {sinxronizasiya dəyişdiricisi} - sinxronizasiya - dəyişdirici, yəni bu metod müxtəlif mövzulardan ona eyni vaxtda daxil olmaqdan qorunur. Metod statik deyilsə, obyektin bu mutexində bağlanır. Metod statikdirsə, cari sinfin mutex üzərində bağlanır. {doğma dəyişdirici} - yerli - bu dəyişdirici metodun fərqli proqramlaşdırma dilində yazıldığını göstərir. <qaytarma dəyəri> metodun qaytarmalı olduğu dəyər növüdür. Heç bir şey qaytarmamalıdırsa, ləğv edin . <metod adı> metodun adı, onun sistemdəki identifikatorudur. {metod arqumentləri} metodun qəbul etdiyi arqumentlərdir (parametrlər): onlar onun funksionallığını həyata keçirmək üçün lazımdır. {atılan istisnalar} - throwsExceptionType - bu metodun ata biləcəyi yoxlanılmış istisnaların siyahısı. Metod başlığına misal olaraq bunu verəcəyəm:
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);
   }
}
Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  4-4-cü hissə

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:
  1. this() yalnız konstruktorda işləyir.
  2. 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.
Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  4-5-ci hissəBu məqalədə daha çox nümunə var .

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 . Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  4-6 hissə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:
  1. Ana sinifin statik sahələri .
  2. Ana sinif üçün statik başlatma bloku .
  3. Uşaq sinifinin statik sahələri .
  4. Uşaq sinfi üçün statik başlatma bloku .
  5. Ana sinifin qeyri-statik sahələri .
  6. Ana sinif üçün statik başlatma bloku deyil .
  7. Ana sinif üçün konstruktor .
  8. Uşaq sinifinin qeyri-statik sahələri .
  9. Uşaq sinfi üçün statik başlatma bloku deyil .
  10. Uşaq sinfinin konstruktoru .
Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  4-7 hissəTəcrübədə işə salma qaydasını izah edən qısa məqalə buradadır .

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
OOP-da IS-A prinsipi sinif varisliyinə və ya interfeysin həyata keçirilməsinə əsaslanır. Məsələn, Lion sinfi Cat- dan miras alırsa , Lion Pişik olduğunu deyirik :
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
Bu tip əlaqə digər siniflər tərəfindən siniflərin istifadəsinə əsaslanır ki, bu da “assosiasiya” adlanır. Assosiasiya başqa bir sinfə (və ya hətta bir-birinə) istinad edən bir sinifdir. Məsələn, Avtomobil sinfi Sərnişin sinfinə istinad edə bilər və bu, əlaqə olacaq:
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. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  4-8-ci hissə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.Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  4-9-cu hissə
Seriyadakı digər materiallar:
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION