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. 5-ci hissə

Qrupda dərc edilmişdir
Salam Salam! Bu gün Java proqramçılarına böyük tələbat var. Təbii ki, sizə vakansiya təqdim edə bilmərəm, amma sizə bir az kömək etməyə çalışacam ki, yeni biliklər əldə edəsiniz və bəzi boşluqları aradan qaldırasınız. Beləliklə, biz Java tərtibatçısı üçün 250+ müsahibə sualını təhlil etməyə davam edirik. Təhlilin əvvəlki hissələrinə keçidlər məqalənin sonundadır.Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  Hissə 5 - 1

39. Java-da giriş modifikatorları hansılardır? Onlara ad verin. Onlar nə üçün istifadə olunur?

Mən əvvəllər Java inkapsulyasiya elementləri ilə bağlı sualda giriş modifikatorlarını təsvir etmişdim. Amma yenə də xatırladacağam. Java-da giriş modifikatorları müəyyən Java komponentinə verilən giriş səviyyəsini təsvir edən açar sözlərdir. Giriş modifikatorları ola bilər:
  • public — bu dəyişdirici ilə element hamı üçün əlçatan olacaq. Bunlar. sahələr və metodlar, ictimai dəyişdirici ilə elan edilmiş siniflər həm cari paketdən, həm də xarici paketlərdən digər siniflərə görünür;
  • qorunan - bu dəyişdirici ilə elementə cari paketin cari sinifində və ya digər paketlərdə olsa belə, nəsil siniflərində istənilən yerdən daxil olmaq mümkün olacaq;
  • default , və ya itkin dəyişdirici - bu dəyişdirici giriş dəyişdiricisi ümumiyyətlə göstərilmədikdə gizli şəkildə istifadə olunur. Bu, əvvəlkinə bənzəyir, istisna olmaqla, digər paketlərdə olan nəsil siniflərində görmə qabiliyyətinə icazə verilir;
  • private bütün modifikatorların ən özəlidir və elementə yalnız cari sinif daxilində giriş imkanı verir.
Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  5-2 hissə

40. Statik və dəyişən metodların əsas xüsusiyyətini adlandırın

Çox qəribə bir formula - "dəyişən üsullar". Şübhəsiz ki, bu, adi, statik olmayan üsullara aiddir. Deməli, əsas fərq ondan ibarətdir ki, statik metodlar sinfə aiddir və əslində onlar üçün bu sinfin nümunəsini yaratmağa ehtiyac yoxdur: onu yalnız sinif tipindən istifadə etməklə çağırmaq olar. Məsələn, pişiyi ovlamaq üçün statik üsulumuz var:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
Onu çağırmaq üçün CatService sinifinin nümunəsinə ehtiyacımız yoxdur :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
Adi metodlar bir obyektə (aidiyyətinə) bağlı olsalar da və onları çağırmaq üçün metodun çağırılacağı bir nümunəniz (obyektiniz) olmalıdır. Məsələn, bir pişiyin statik olmayan bir üsulu var - miyavlama:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
Bu metodu çağırmaq üçün bizə müəyyən bir pişik nümunəsi lazımdır:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. Statik və “dəyişən” metodlara əsas məhdudiyyətlər hansılardır?

Daha əvvəl dediyim kimi, müntəzəm metodun əsas məhdudiyyəti ondan ibarətdir ki, hər zaman metodun çağırılacağı bir nümunə olmalıdır. Lakin statik metod bunu tələb etmir, lakin o, bu istinada - cari obyektin elementlərinə istinad edə bilməz, çünki onun üçün cari obyekt mövcud deyil.

42. Statik açar söz nə deməkdir? Statik metodu ləğv etmək və ya həddindən artıq yükləmək olarmı?

Static açar sözü ilə təyin olunan element sinifin obyektinə deyil, daha çox sinfə aiddir və sinfin özü yükləndikdə yüklənir. Statik elementlər bütün proqram üçün, adi elementlər isə konkret obyekt üçün yeganədir. Statik ola bilər:
  • sinif sahələri;
  • sinifin başlanğıc bloku;
  • sinif metodu;
  • bir sinfin daxili sinifləri (lakin bu hələ tavtologiyadır).
Statik metodu ləğv etmək olmaz: o, sinfə aiddir və miras alınmır, lakin eyni zamanda həddindən artıq yüklənə bilər.

43. Metod eyni zamanda statik və abstrakt ola bilərmi?

Bunu əvvəlki məqalədə artıq qeyd etmişdim: metod eyni zamanda abstrakt və statik ola bilməz. Metodun mücərrədliyi o deməkdir ki, onun varisdə ləğv edilməsi lazımdır. Eyni zamanda, statik metod sinifə aiddir və onu ləğv etmək olmaz: bu, tərtibçinin görəcəyi və lənətləməyə başlayacağı bir ziddiyyətə səbəb olacaq. Əgər belə bir vəziyyətiniz varsa, tətbiqinizin arxitekturasının düzgünlüyünü ciddi şəkildə düşünməlisiniz (hər şeydən sonra, burada bir səhv var).Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  5-3-cü hissə

44. Adi üsulların ortasında statik metodlardan istifadə etmək olarmı? Əksinə? Niyə?

Statik üsullar adi üsullarda istifadə edilə bilər, çünki heç bir şey buna mane olmur. Eyni zamanda, əksinə vəziyyət mümkün deyil: statik bir metod bu sinfin xüsusi bir nümunəsinə istinad etmədən müntəzəm metoddan istifadə edə bilməz. Və xatırladığımız kimi, bu arayış statik sinif üzvləri üçün mövcud deyil: sinifin istədiyiniz qədər xüsusi obyektləri ola bilər və onların hər birinin daxilində özünə istinad olacaq - bu . Bəs bu keçiddən hansını götürməli olduğunuzu necə başa düşürsünüz ? Amma heç cür. Buna görə də, statik elementlər müəyyən bir obyektə istinad etmədən qeyri-statik elementlərə istinad edə bilməz. Əslində, statik metod qeyri-statik metoddan yalnız müəyyən bir obyektə istinad olduqda istifadə edə bilər. Məsələn, arqument kimi gələn:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
Burada görürük ki, petTheCat statik metodu Cat obyektinin normal, qeyri-statik metodunu çağırır - getName .

45. İnterfeys nədir? Son interfeys ola bilərmi?

Xatırladığımız kimi, Java-da çoxlu miras yoxdur. İnterfeyslər ona alternativdir. İnterfeys çox soyulmuş bir sinifə bənzəyir. Onlar bu interfeysləri həyata keçirən (həyata keçirən) siniflər tərəfindən həyata keçirilən xüsusi icra olmadan funksionallığı müəyyən edirlər. İnterfeys nümunəsi:
public interface Animal {
    void voice();
}
Bir sinif tərəfindən interfeys tətbiqinə bir nümunə:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
İnterfeyslərdən istifadə haqqında bilməli olduğunuz əsas şey:
  1. İnterfeys metodları xüsusi metod gövdəsi olmadan yalnız başlıqdan ibarət olmalıdır, yəni. mücərrəd olmalıdır (lakin abstrakt açar sözündən istifadə etmədən ). Bunun istisnası, metod gövdəsi tələb edən statik və standart metodlardır.
  2. Bir sinif vergüllə ayrılmış çoxlu interfeysləri həyata keçirə bilər (dediyim kimi, bu çoxlu varisliyə alternativdir): sinif Lion Animal, Wild tətbiq edir .
  3. İnterfeyslər - interfeys açar sözündən istifadə etməklə yaradılır .
  4. Bir sinif tərəfindən interfeys həyata keçirərkən açar söz həyata keçirir .
  5. Müəyyən bir interfeysi həyata keçirən sinif onun bütün mücərrəd metodlarını həyata keçirməli və ya özünü mücərrəd elan etməlidir.
  6. İnterfeyslərdən istifadənin əsas məqsədi polimorfizmi (obyektlərin bir çox formalar almaq qabiliyyəti) həyata keçirməkdir.
  7. Bir qayda olaraq, metodlar üçün giriş modifikatorları interfeysdə yazılmır: onlar standart olaraq açıqdır ictimaidən başqa digər modifikatorlar müəyyən edilə bilməz. Java 9-dan bəri metodlar üçün şəxsi dəyişdiricilərdən istifadə edə bilərsiniz .
  8. İnterfeys dəyişənləri standart olaraq statik yekundur , başqa sözlə, sabitlərdir: onlar həmişə birbaşa interfeysdə işə salınmalıdır.
  9. Siz interfeys obyekti yarada bilməzsiniz.
İnterfeyslərin son ola biləcəyi sualının cavabı əlbəttə ki, deyil. Axı, interfeyslərin mahiyyəti həyata keçirilməlidir. Və hamımızın çox yaxşı xatırladığımız kimi, sinif səviyyəsində final onu irsi, interfeys vəziyyətində isə həyata keçirilməz edir. Tətbiq edilə bilməyən və istifadə edilə bilməyən interfeysə niyə ehtiyacımız var? Düzdü - ehtiyac yoxdur! Kompilyator belə düşünür)) Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  5-4-cü hissəMəna yalnız Java 8 ilə interfeyslərdə statik metodların tətbiqi ilə ortaya çıxdı, lakin bu, interfeysin yekun ola bilməyəcəyi faktını dəyişdirmədi. İnterfeyslər haqqında çox səthi danışdım, çünki... bu geniş mövzudur. Java-da interfeyslərabstrakt siniflər və interfeyslər arasındakı fərq haqqında məqalələrdə bu barədə daha çox oxuyun .

46. ​​Statik sahələri harada işə sala bilərəm?

Statik sahələr işə salına bilər:
  • birbaşa bəyan edildikdə, bərabər işarəsi ilə = ;
  • statik başlatma blokunda;
  • qeyri-statik başlatma blokunda, lakin siz başa düşməlisiniz ki, hər dəfə obyekt yaradılanda bu sahə bu işəsalma bloku tərəfindən üzərinə yazılacaq;
  • sinif konstruktorunda. Bu konstruktor hər dəfə çağırılanda (yəni bu konstruktor vasitəsilə obyekt yaradıldıqda) bu sahənin üzərinə yazılacaq;
  • statik üsullarda;
  • qeyri-statik üsullarda;
  • daxili statik və qeyri-statik, lokal və anonim siniflərdə.

47. Anonim siniflər hansılardır?

Anonim siniflər öz tipi olmayan siniflərdir. Mən nədən danışıram? İnterfeyslər haqqında danışarkən qeyd etdim ki, siz interfeys obyekti yarada bilməzsiniz: siz yalnız interfeysi həyata keçirən sinif obyektini yarada bilərsiniz. Əgər siz sinifdə interfeys tətbiq etmək istəmirsinizsə, lakin hələ də interfeys tipli obyektə ehtiyacınız varsa nə etməli? Və çox güman ki, bu, bu obyektdən istifadənin tək bir halı olacaq. Və tam hüquqlu bir tətbiq sinfi yaratmağa ehtiyac yoxdur. Bunu necə edəcəksən? Doğru! Anonim sinif vasitəsilə! Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  5-5-ci hissəDeyək ki, bəzi Heyvan interfeysimiz var :
public final interface Animal {
   public void voice();
}
Bu interfeysi anonim sinif vasitəsilə yaratmaq istəyiriksə:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
Və sonra bu obyektdən və onun həyata keçirilən metodundan etibarlı şəkildə istifadə edə bilərsiniz - səs . Yəni anonim sinif bu interfeysi və onun bütün mücərrəd üsullarını elə burada və indi həyata keçirir. Əks halda biz interfeys/mücərrəd sinif obyekti yarada bilməyəcəyik, çünki tətbiq olunmamış/abstrakt metodlar mövcuddur. Qeyd etdiyim kimi, anonim siniflər interfeysin mücərrəd üsullarını həyata keçirmək üçün deyil, həm də mücərrəd sinfin abstrakt metodlarını həyata keçirmək üçün istifadə olunur. Bu yanaşma obyektin birdəfəlik istifadə edildiyi və ya metodların müəyyən bir tətbiqinə yalnız bir dəfə ehtiyac duyulduğu və tələb olunan abstrakt sinif/interfeys həyata keçirəcək ayrıca sinif yaratmağa ehtiyac olmadığı vəziyyətlər üçün yaxşıdır. Amma onu da qeyd edim ki, anonim siniflərdən istifadə işdə nadir haldır: bir qayda olaraq, yenə də adi dərslərə üstünlük verilir. Bu məqalədə anonim siniflər haqqında daha çox oxuya bilərsiniz .

48. İbtidai siniflər hansılardır?

Mənə gəlincə, bu çox qəribə sualdır və bəlkə də bu, tələ sualıdır, çünki Java-da ibtidai siniflər deyə bir şey yoxdur: bəlkə də əvvəllər nəzərdən keçirdiyimiz primitiv tiplər anlayışından başqa. Xatırladığımız kimi, Java-da 8 primitiv tip var - byte , short , int , long , float , double , char , boolean .Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  5-6 hissə

49. “Sağlayıcı” sinfi hansıdır?

Java-da primitiv tiplərdən istifadənin əsas problemi onların hələ də sinif olmamasıdır və Java hələ də OOP dilidir. Yəni bu dildə yazılan proqramlar obyektlər arasında qarşılıqlı əlaqəyə endirilir. Yaxşı, primitivlər obyekt deyil. Onların metodları yoxdur, hətta Object sinfindən standart olanlar belə . Yaxşı, Map -də açar kimi primitivdən istifadə etmək lazım gəlsə nə olar ? Sonra hashCode metodunu çağırmalısınız . Orada bərabər metodu da çağıra bilərsiniz . Bəs onda? Primitivləri proqramda istifadə olunmayan və arzuolunmaz elementlər halına gətirən ibtidai deyil, sinifin olması lazım olan çox, çox məqamlar ola bilər, çünki bu, OOP ideyasını məhv edir. Ancaq hər şey göründüyü qədər pis deyil. Axı Java-da primitiv sarğı anlayışı var. Hər bir primitiv növün analoq sinfi var:
  • bayt -> Bayt.class
  • qısa -> Qısa.class
  • int -> Integer.class
  • long -> Long.class
  • float -> Float.class
  • double -> Double.class
  • char -> Xarakter.class
  • boolean -> Boolean.class
Bu, sadə növlərin bir təmsilidir, lakin müxtəlif və funksional metodların bir dəstəsi olan tam hüquqlu siniflər şəklindədir. Bu siniflərdən rahat istifadə üçün avtoboksinq və qutudan çıxarma anlayışları təqdim edilmişdir. Autoboxing - zəruri hallarda ibtidai növün analoq sinfinə avtomatik çevrilməsi (məsələn, intTam ). Qutunun açılması əvvəlkinin əks prosesidir: ibtidai sarğı sinifinin avtomatik olaraq primitiv tipə çevrilməsi (məsələn, Tam ədəddən int ). İbtidai sarğı siniflərinin tətbiqi və avtoboksinqqutudan çıxarma prosesləri sayəsində ibtidai növlər OOP dilinin - Java-nın tam hüquqlu üzvlərinə çevrilə bildilər. Bu mövzu haqqında daha çox məlumat əldə etmək üçün bu məqaləniJava tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  5-7 hissə oxumağı tövsiyə edirəm .

50. Nested sinfi nədir? Nə vaxt istifadə olunur?

İç-içə sinif başqa bir sinfin üzvü olan daxili sinifdir. Java-da belə daxili siniflərin 4 növü var: 1. Daxili sinif Bu tip sinif bilavasitə başqa bir sinfin korpusunda elan olunur. İç içə salınmış daxili sinif xarici sinif nümunəsinin istənilən şəxsi sahəsinə və ya metoduna daxil ola bilər. Nümunə olaraq, bir heyvanın - zebranın olacağı bir zoopark yaradaq:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Mürəkkəb bir şey yoxdur, elə deyilmi? Daxili sinif obyektinin yaradılması nümunəsinə nəzər salaq:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
Artıq gördüyünüz kimi, çərçivə sinfinin obyektini yaratmaq vacibdir, onun istinadına əsaslanaraq daxili sinif obyektini yarada bilərsiniz. Onu da qeyd etmək istərdim ki, iç-içə daxili sinifdə statik metodlar və ya statik sahələr ola bilməz . Çünki daxili sinif öz xarici sinfinin obyekti ilə gizli şəkildə əlaqələndirilir və öz daxilində heç bir statik metod elan edə bilməz. 2. Statik iç içə siniflər Bu sinif əvvəlki ilə oxşardır, yalnız onun sinif bəyannaməsi yaxınlığında statik giriş dəyişdiricisi var. Bu cür sinfin xarici sinfin qeyri-statik sahələrinə çıxışı olmadığı üçün o, daxili sinifdən daha çox xarici sinfin statik hissəsinə bənzəyir. Bu halda, sinif verilənləri xarici sinfin bütün statik üzvlərinə, hətta özəl olanlara da daxil olur. Statik yuvalanmış sinif nümunəsi:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Yaratma üsulu əvvəlkindən bir qədər fərqlidir:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
Burada daxili statik sinif obyekti yaratmaq üçün bizə xarici sinif obyektinə ehtiyac yoxdur. Xarici sinifdən bizə yalnız onun növü lazımdır ki, biz yuvalanmış sinfin yerini tapa bilək. 3. Lokal siniflər Lokal siniflər metodun gövdəsi daxilində elan edilmiş siniflərdir və lokal sinfin obyektinin yaradılması və istifadəsi yalnız bu metod çərçivəsində mümkündür. Misal:
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);
               ...
İstifadə nümunəsi:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
toFeed metodunun kodunu görmədən yerli sinfin mövcudluğundan belə şübhələnməzdiniz, elə deyilmi? Yerli sinif statik və ya keçici ola bilməz, lakin o, mücərrəd və ya yekun olaraq qeyd oluna bilər (yalnız VEYA, çünki bu iki dəyişdiricidən istifadə münaqişəyə səbəb olacaq). 4. Anonim siniflər Artıq yuxarıda anonim siniflər haqqında danışdıq və xatırladığınız kimi, onlar iki mənbədən - interfeyslərdən və siniflərdən yaradıla bilər. Daxili statik və qeyri-statik siniflərdən istifadə üçün səbəblərdən istifadə olunur, çünki bəzən kiçik sinifləri daha böyüklərin içərisinə daxil etmək və onları bir yerdə saxlamaq daha yaxşıdır: beləliklə onlar daha yüksək birləşmə və ümumi məqsədə sahib olacaqlar. Əslində, iç-içə siniflərin istifadəsi kod inkapsulyasiyasını artırır. Yerli siniflərin seçilməsinin səbəbi müəyyən bir sinifin yalnız bir metod daxilində istifadə edilməsi ola bilər. Bu halda kodu bütün proqrama yaymaq lazımdırmı? Yox. Amma eyni zamanda əlavə edəcəyəm ki, öz təcrübəmdə heç vaxt yerli dərslərdən istifadəni görməmişəm, çünki onlara ehtiyac olduqca mübahisəlidir. Yaxşı, anonim siniflərdən istifadənin səbəbi ola bilər ki, bir interfeysin və ya mücərrəd sinfin xüsusi tətbiqi yalnız bir dəfə lazım olacaq, buna görə də bunun üçün tətbiqi ilə ayrıca, tam hüquqlu bir sinif yaratmağa ehtiyac yoxdur. Əvəzində sadə üsulla anonim sinif vasitəsilə bizə lazım olan metod(lar)ı həyata keçirdik, bu obyektdən istifadə etdik və onu unutduq (yaxşı ki, Zibil kolleksiyaçısı bu haqda xatırladı). BubuJava tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  5-8 hissə məqalə daxili dərsləri daha ətraflı öyrənməyə kömək edəcək .

51. Sinif hansı giriş modifikatorlarına malik ola bilər?

Xatırladığımız kimi, müxtəlif növ siniflər var və onlara müxtəlif giriş modifikatorları tətbiq olunur:
  • xarici sinif giriş dəyişdiricisi ictimai ola bilər və ya dəyişdiricisiz ola bilər (defolt dəyişdirici);
  • daxili sinif bütün 4 giriş modifikatorunu dəstəkləyir;
  • iç içə statik sinif qorunan istisna olmaqla, bütün giriş modifikatorlarını dəstəkləyir , çünki bu modifikator sinfin statik üzvünə zidd olan irsiliyi nəzərdə tutur (statik elementlər miras alınmır);
  • yerli sinif yalnız standart dəyişdiriciyə malik ola bilər (yəni, heç bir dəyişdirici yoxdur);
  • anonim sinif : sinif növü bəyannaməsi yoxdursa, o zaman heç bir giriş modifikatoru yoxdur.
Bu gün dayanacağımız yer budur. Tezliklə görüşərik!Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  5-9 hissə
Seriyadakı digər materiallar:
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION