JavaRush /Blog Java /Random-MS /Analisis soalan dan jawapan daripada temu bual untuk pemb...

Analisis soalan dan jawapan daripada temu bual untuk pembangun Java. Bahagian 5

Diterbitkan dalam kumpulan
Hello Hello! Hari ini, pembangun Java mendapat permintaan yang tinggi. Sudah tentu, saya tidak dapat memberi anda kekosongan, tetapi saya akan cuba membantu anda memperoleh pengetahuan baharu dan menutup beberapa jurang. Jadi kami terus menganalisis 250+ soalan temu bual untuk pembangun Java. Pautan ke bahagian analisis sebelumnya ada di penghujung artikel.Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 5 - 1

39. Apakah itu pengubahsuai akses dalam Java? Namakan mereka. Untuk apa mereka digunakan?

Saya sebelum ini menerangkan pengubah suai akses dalam soalan mengenai elemen enkapsulasi Java. Tetapi saya akan mengingatkan anda pula. Pengubah suai akses dalam Java ialah kata kunci yang menerangkan tahap akses yang diberikan kepada komponen Java tertentu. Pengubah suai akses boleh:
  • awam — elemen dengan pengubah suai ini boleh diakses secara umum. Itu. medan dan kaedah, kelas yang diisytiharkan dengan pengubah suai awam boleh dilihat oleh kelas lain dari pakej semasa dan dari pakej luaran;
  • dilindungi - elemen dengan pengubah suai ini boleh diakses dari mana-mana sahaja dalam kelas semasa pakej semasa atau dalam kelas turunan, walaupun jika ia berada dalam pakej lain;
  • lalai , atau pengubah hilang - pengubah suai ini digunakan secara tersirat apabila pengubah suai akses tidak dinyatakan sama sekali. Ia serupa dengan yang sebelumnya, kecuali keterlihatan dibenarkan dalam kelas keturunan yang berada dalam pakej lain;
  • private ialah yang paling peribadi daripada semua pengubah, membenarkan akses kepada elemen hanya dalam kelas semasa.
Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 5 - 2

40. Namakan ciri utama kaedah statik dan pembolehubah

Formulasi yang sangat pelik - "kaedah pembolehubah". Sudah tentu ini merujuk kepada kaedah biasa, bukan statik. Jadi, perbezaan utama ialah kaedah statik tergolong dalam kelas dan, sebenarnya, bagi mereka anda tidak perlu membuat contoh kelas ini: ia hanya boleh dipanggil menggunakan jenis kelas. Sebagai contoh, kami mempunyai kaedah statik untuk membelai kucing:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
Kami tidak memerlukan contoh kelas CatService untuk memanggilnya :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
Walaupun kaedah biasa terikat kepada (milik) objek, dan untuk memanggilnya, anda mesti mempunyai contoh (objek) di mana kaedah itu akan dipanggil. Sebagai contoh, kucing mempunyai kaedah bukan statik - mengeong:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
Untuk memanggil kaedah ini, kami memerlukan contoh khusus kucing:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. Apakah sekatan utama ke atas kaedah statik dan "pembolehubah"?

Seperti yang saya katakan sebelum ini, had utama kaedah biasa ialah mesti sentiasa ada beberapa contoh di mana kaedah itu akan dipanggil. Tetapi kaedah statik tidak memerlukan ini, tetapi ia tidak boleh merujuk kepada rujukan ini - kepada unsur-unsur objek semasa - kerana objek semasa tidak wujud untuknya.

42. Apakah maksud kata kunci statik? Bolehkah kaedah statik ditindih atau terlebih beban?

Elemen yang ditetapkan oleh kata kunci statik bukan kepunyaan objek kelas, sebaliknya kepada kelas, dan ia dimuatkan apabila kelas itu sendiri dimuatkan. Elemen statik adalah satu-satunya untuk keseluruhan program, dan elemen biasa adalah satu-satunya untuk objek tertentu. Statik boleh:
  • medan kelas;
  • blok permulaan kelas;
  • kaedah kelas;
  • kelas dalaman kelas (namun, itu masih tautologi).
Kaedah statik tidak boleh ditindih: ia tergolong dalam kelas dan tidak diwarisi, tetapi pada masa yang sama ia boleh terlebih beban.

43. Bolehkah sesuatu kaedah menjadi statik dan abstrak pada masa yang sama?

Saya telah menyebut perkara ini dalam artikel sebelumnya: kaedah tidak boleh abstrak dan statik pada masa yang sama. Keabstrakan sesuatu kaedah bermakna ia mesti ditindih dalam pengganti. Pada masa yang sama, kaedah statik tergolong dalam kelas dan tidak boleh ditindih: ini akan menyebabkan percanggahan, yang akan dilihat oleh pengkompil dan mula mengutuk. Sekiranya anda mempunyai situasi sedemikian, anda harus memikirkan dengan serius tentang ketepatan seni bina aplikasi anda (lagipun, jelas ada yang salah dengannya).Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 5 - 3

44. Adakah mungkin untuk menggunakan kaedah statik di tengah-tengah kaedah biasa? sebaliknya? kenapa?

Kaedah statik boleh digunakan dalam kaedah biasa, kerana tiada apa yang menghalangnya. Pada masa yang sama, keadaan terbalik adalah mustahil: kaedah statik tidak boleh menggunakan kaedah biasa tanpa merujuk kepada contoh khusus kelas ini. Dan seperti yang kita ingat, rujukan ini tidak tersedia untuk ahli kelas statik: boleh ada seberapa banyak objek khusus kelas yang anda mahu, dan setiap daripada mereka akan mempunyai rujukan kepada dirinya sendiri di dalam - this . Dan bagaimanakah anda memahami pautan mana yang perlu anda ambil? Tetapi tidak mungkin. Oleh itu, elemen statik tidak boleh merujuk kepada unsur bukan statik, tanpa merujuk kepada objek tertentu. Sebenarnya, kaedah statik boleh menggunakan kaedah bukan statik hanya jika ia mempunyai rujukan kepada objek tertentu. Sebagai contoh, yang datang sebagai hujah:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
Di sini kita melihat bahawa kaedah statik petTheCat memanggil kaedah biasa, bukan statik objek Cat - getName .

45. Apakah antara muka? Bolehkah terdapat antara muka akhir?

Seperti yang kita ingat, tidak ada warisan berbilang di Jawa. Antara muka adalah sesuatu alternatif kepadanya. Antara muka kelihatan seperti kelas yang sangat dilucutkan. Mereka mentakrifkan fungsi tanpa pelaksanaan khusus, yang dilaksanakan oleh kelas yang melaksanakan (melaksanakan) antara muka ini. Contoh antara muka:
public interface Animal {
    void voice();
}
Contoh pelaksanaan antara muka oleh kelas:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Perkara utama yang perlu anda ketahui tentang menggunakan antara muka ialah:
  1. Kaedah antara muka hendaklah mengandungi hanya pengepala, tanpa badan kaedah tertentu, i.e. mestilah abstrak (tetapi tanpa menggunakan kata kunci abstrak ). Pengecualian untuk ini ialah kaedah statik dan lalai, yang memerlukan badan kaedah.
  2. Kelas boleh melaksanakan banyak antara muka (seperti yang saya katakan, ini adalah alternatif kepada warisan berbilang), yang ditulis dipisahkan dengan koma: kelas Lion melaksanakan Animal, Wild .
  3. Antara muka dicipta menggunakan antara muka kata kunci .
  4. Apabila melaksanakan antara muka oleh kelas, kata kunci ialah implements .
  5. Kelas yang melaksanakan antara muka tertentu mesti melaksanakan semua kaedah abstraknya, atau mesti mengisytiharkan dirinya sebagai abstrak.
  6. Tujuan utama penggunaan antara muka adalah untuk melaksanakan polimorfisme (keupayaan objek untuk mengambil pelbagai bentuk).
  7. Sebagai peraturan, pengubah akses untuk kaedah tidak ditulis dalam antara muka: ia adalah awam secara lalai , dan pengubah lain selain daripada awam tidak boleh ditentukan. Sejak Java 9, anda boleh menggunakan pengubah suai peribadi untuk kaedah.
  8. Pembolehubah antara muka adalah statik muktamad secara lalai , dalam erti kata lain, pemalar: mereka sentiasa perlu dimulakan terus dalam antara muka.
  9. Anda tidak boleh mencipta objek antara muka.
Jawapan kepada soalan sama ada antara muka boleh muktamad sudah tentu tidak. Lagipun, intipati antara muka adalah untuk dilaksanakan. Dan seperti yang kita semua ingat dengan baik, muktamad pada peringkat kelas menjadikannya tidak boleh diwarisi, dan dalam kes antara muka, tidak boleh dilaksanakan. Mengapa kita memerlukan antara muka yang tidak boleh dilaksanakan dan digunakan? Betul - tidak perlu! Dan pengkompil berpendapat demikian)) Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 5 - 4Maknanya hanya muncul dengan pengenalan kaedah statik dalam antara muka dengan Java 8, tetapi ini tidak mengubah fakta bahawa antara muka tidak boleh muktamad. Saya bercakap tentang antara muka, secara dangkal, kerana... ini adalah topik yang luas. Baca lebih lanjut mengenai perkara ini dalam artikel tentang antara muka dalam Java dan perbezaan antara kelas abstrak dan antara muka .

46. ​​Di manakah saya boleh memulakan medan statik?

Medan statik boleh dimulakan:
  • secara langsung selepas pengisytiharan, melalui tanda sama dengan = ;
  • dalam blok permulaan statik;
  • dalam blok permulaan bukan statik, tetapi anda mesti faham bahawa setiap kali objek dicipta, medan ini akan ditimpa oleh blok permulaan ini;
  • dalam pembina kelas. Setiap kali pembina ini dipanggil (iaitu, apabila objek dicipta melalui pembina ini), medan ini akan ditimpa;
  • dalam kaedah statik;
  • dalam kaedah bukan statik;
  • dalam kelas statik dan bukan statik dalaman, tempatan dan tanpa nama.

47. Apakah kelas tanpa nama?

Kelas tanpa nama ialah kelas yang tidak mempunyai jenisnya sendiri. Apa yang saya cakapkan? Apabila kita bercakap tentang antara muka, saya menyebut bahawa anda tidak boleh mencipta objek antara muka: anda hanya boleh mencipta objek kelas yang melaksanakan antara muka. Bagaimana jika anda tidak mahu melaksanakan antara muka dalam kelas, tetapi anda masih memerlukan objek jenis antara muka? Dan kemungkinan besar, ini akan menjadi satu kes menggunakan objek ini. Dan anda tidak perlu membuat kelas pelaksanaan yang lengkap. Bagaimana anda akan melakukan ini? Betul! Melalui kelas tanpa nama! Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 5 - 5Katakan kita mempunyai beberapa antara muka Haiwan :
public final interface Animal {
   public void voice();
}
Jika kita ingin membuat contoh antara muka ini melalui kelas tanpa nama:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
Dan kemudian anda boleh menggunakan objek ini dengan selamat dan kaedah yang dilaksanakan - suara . Iaitu, kelas tanpa nama melaksanakan antara muka ini dan semua kaedah abstraknya di sini dan sekarang. Jika tidak, kami tidak akan dapat mencipta antara muka/objek kelas abstrak, kerana terdapat kaedah yang tidak dilaksanakan/abstrak. Seperti yang saya nyatakan, kelas tanpa nama digunakan bukan sahaja untuk melaksanakan kaedah abstrak antara muka, tetapi juga untuk melaksanakan kaedah abstrak kelas abstrak. Pendekatan ini bagus untuk situasi apabila objek digunakan sekali atau pelaksanaan kaedah tertentu diperlukan sekali sahaja, dan tidak perlu mencipta kelas berasingan yang akan melaksanakan kelas/antara muka abstrak yang diperlukan. Tetapi saya juga akan ambil perhatian bahawa penggunaan kelas tanpa nama adalah kejadian yang jarang berlaku dalam kerja: sebagai peraturan, keutamaan masih diberikan kepada kelas biasa. Anda boleh membaca lebih lanjut tentang kelas tanpa nama dalam artikel ini .

48. Apakah itu kelas primitif?

Bagi saya, ini adalah soalan yang sangat pelik dan, mungkin, ini adalah soalan perangkap, kerana di Jawa tidak ada kelas primitif: kecuali mungkin konsep jenis primitif, yang telah kita pertimbangkan sebelum ini. Seperti yang kita ingat, terdapat 8 jenis primitif dalam Java - byte , short , int , long , float , double , char , boolean .Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 5 - 6

49. Apakah kelas "pembungkus"?

Masalah utama dengan menggunakan jenis primitif dalam Java ialah mereka masih bukan kelas, dan Java masih merupakan bahasa OOP. Iaitu, program yang ditulis dalam bahasa ini dikurangkan kepada interaksi antara objek. Nah, primitif bukan objek. Mereka tidak mempunyai kaedah, malah yang standard daripada kelas Object . Nah, bagaimana jika kita perlu menggunakan primitif sebagai kunci dalam Peta ? Kemudian anda perlu memanggil kaedah hashCode . Anda juga boleh memanggil kaedah equals di sana . Selepas itu, apa? Mungkin terdapat banyak, sangat banyak saat di mana harus ada kelas, dan bukan primitif, yang menjadikan primitif tidak digunakan dan elemen tidak diingini dalam program, kerana ini memusnahkan idea OOP. Tetapi tidak semuanya seburuk yang kelihatan. Lagipun, Java mempunyai konsep pembungkus primitif. Setiap jenis primitif mempunyai kelas analog:
  • byte -> Byte.class
  • pendek -> Pendek.kelas
  • int -> Integer.class
  • panjang -> Panjang.kelas
  • terapung -> Terapung.kelas
  • double -> Double.class
  • char -> Character.class
  • boolean -> Boolean.class
Ini adalah perwakilan jenis mudah, tetapi dalam bentuk kelas lengkap dengan sekumpulan kaedah yang pelbagai dan berfungsi. Untuk memudahkan penggunaan kelas ini, konsep autoboxing dan unboxing telah diperkenalkan. Autoboxing - penukaran automatik jenis primitif kepada kelas analog jika perlu (contohnya, int kepada Integer ). Menyahkotak ialah proses terbalik daripada yang sebelumnya: menukar kelas pembalut primitif secara automatik kepada jenis primitif (contohnya, Integer kepada int ). Terima kasih kepada pengenalan kelas pembalut primitif dan proses autoboxing dan unboxing , jenis primitif dapat menjadi ahli sepenuhnya bahasa OOP - Java. Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 5 - 7Untuk mengetahui lebih lanjut tentang topik ini, saya amat mengesyorkan membaca artikel ini .

50. Apakah kelas Nested? Bilakah ia digunakan?

Kelas bersarang ialah kelas dalaman yang merupakan ahli kelas lain. Di Java, terdapat 4 jenis kelas dalaman tersebut: 1. Inner class Kelas jenis ini diisytiharkan terus dalam badan kelas lain. Kelas dalam bersarang boleh mengakses mana-mana medan peribadi atau kaedah contoh kelas luar. Sebagai contoh, mari kita buat zoo di mana kita akan mempunyai haiwan - seekor kuda belang:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Tidak ada yang rumit, bukan? Mari kita lihat contoh mencipta objek kelas dalaman:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
Seperti yang telah anda lihat, adalah penting untuk mencipta objek kelas pembingkaian, berdasarkan rujukan yang mana anda boleh mencipta objek kelas dalam. Saya juga ingin ambil perhatian bahawa kelas dalaman bersarang tidak boleh mempunyai kaedah statik atau medan statik. Ini kerana kelas dalam dikaitkan secara tersirat dengan objek kelas luarnya dan ia tidak boleh mengisytiharkan sebarang kaedah statik dalam dirinya. 2. Kelas bersarang statik Kelas ini serupa dengan yang sebelumnya, cuma ia mempunyai pengubah akses statik berhampiran pengisytiharan kelas. Memandangkan kelas jenis ini tidak mempunyai akses kepada medan bukan statik kelas luar, ia lebih seperti bahagian statik kelas luar daripada kelas dalam. Dalam kes ini, data kelas mempunyai akses kepada semua ahli statik kelas luar, malah yang peribadi. Contoh kelas bersarang statik:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Kaedah penciptaan sedikit berbeza daripada yang sebelumnya:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
Di sini kita tidak memerlukan objek kelas luar untuk mencipta objek kelas statik bersarang. Dari kelas luar, kita hanya memerlukan jenisnya supaya kita boleh mencari lokasi kelas bersarang. 3. Kelas tempatan Kelas tempatan ialah kelas yang diisytiharkan di dalam badan kaedah, dan penciptaan dan penggunaan objek kelas tempatan boleh dilakukan secara eksklusif dalam kaedah ini. Contoh:
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);
               ...
Contoh penggunaan:
Zoo zoo = new Zoo();
zoo.toFeed("зебра", "яблоко");
Tanpa melihat kod untuk kaedah toFeed , anda tidak akan mengesyaki kewujudan kelas tempatan, bukan? Kelas tempatan tidak boleh statik atau sementara , tetapi ia boleh ditandakan sebagai abstrak atau muktamad (hanya ATAU, kerana menggunakan kedua-dua pengubah suai ini akan menyebabkan konflik). 4. Kelas tanpa nama Kami telah pun membincangkan tentang kelas tanpa nama di atas, dan seperti yang anda ingat, mereka boleh dibuat daripada dua sumber - antara muka dan kelas. Sebab untuk menggunakan kelas statik dan bukan statik dalaman digunakan kerana kadangkala adalah lebih baik untuk membenamkan kelas kecil dalam kelas yang lebih besar dan mengekalkannya bersama-sama: dengan cara ini mereka akan mempunyai perpaduan yang lebih tinggi dan tujuan yang sama. Sebenarnya, penggunaan kelas bersarang meningkatkan enkapsulasi kod. Sebab untuk memilih kelas tempatan mungkin kerana kelas tertentu digunakan secara eksklusif dalam satu kaedah. Dalam kes ini, adakah perlu untuk menyebarkan kod ke seluruh aplikasi? Tidak. Tetapi pada masa yang sama saya akan menambah bahawa dalam amalan saya, saya tidak pernah melihat penggunaan kelas tempatan, kerana keperluan untuk mereka adalah sangat kontroversi. Nah, sebab untuk menggunakan kelas tanpa nama mungkin kerana pelaksanaan khusus antara muka atau kelas abstrak akan diperlukan sekali sahaja, jadi tidak perlu mencipta kelas yang berasingan dan lengkap dengan pelaksanaan untuk ini. Sebaliknya, dengan cara yang mudah, kami melaksanakan kaedah yang kami perlukan melalui kelas tanpa nama, menggunakan objek ini dan melupakannya (baik, pengumpul Sampah mengingatinya). Ini dan artikel iniAnalisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 5 - 8 akan membantu anda mempelajari kelas dalaman dengan lebih terperinci .

51. Apakah pengubah akses yang boleh dimiliki oleh kelas?

Seperti yang kita ingat, terdapat pelbagai jenis kelas dan pengubah suai akses yang berbeza boleh digunakan untuk mereka:
  • kelas luar boleh mempunyai pengubah akses awam atau tanpa pengubah (pengubah suai lalai);
  • kelas dalam menyokong semua 4 pengubah akses;
  • kelas statik bersarang menyokong semua pengubah suai akses kecuali protected , kerana pengubah suai ini membayangkan pewarisan, yang bercanggah dengan ahli statik kelas (elemen statik tidak diwarisi);
  • kelas tempatan hanya boleh mempunyai pengubah suai lalai (iaitu, tiada pengubah suai sama sekali);
  • kelas tanpa nama : jika tiada pengisytiharan jenis kelas, maka tiada pengubah akses sama sekali.
Di sinilah kita akan berhenti hari ini. Jumpa lagi!Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 5 - 9
Bahan lain dalam siri ini:
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION