JavaRush /Java Blog /Random-ID /Analisis tanya jawab dari wawancara untuk pengembang Java...

Analisis tanya jawab dari wawancara untuk pengembang Java. Bagian 5

Dipublikasikan di grup Random-ID
Halo halo! Saat ini, pengembang Java sangat diminati. Tentu saja, saya tidak dapat memberi Anda lowongan, tetapi saya akan mencoba membantu Anda memperoleh pengetahuan baru dan menutup beberapa kesenjangan. Jadi kami terus menganalisis 250+ pertanyaan wawancara untuk pengembang Java. Tautan ke bagian analisis sebelumnya ada di akhir artikel.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 5 - 1

39. Apa yang dimaksud dengan pengubah akses di Java? Sebutkan nama mereka. Untuk apa mereka digunakan?

Saya sebelumnya menjelaskan pengubah akses dalam pertanyaan tentang elemen enkapsulasi Java. Tapi aku akan tetap mengingatkanmu. Pengubah akses di Java adalah kata kunci yang menggambarkan tingkat akses yang diberikan ke komponen Java tertentu. Pengubah akses dapat berupa:
  • publik — elemen dengan pengubah ini akan dapat diakses publik. Itu. bidang dan metode, kelas yang dideklarasikan dengan pengubah publik dapat dilihat oleh kelas lain baik dari paket saat ini maupun dari paket eksternal;
  • dilindungi - elemen dengan pengubah ini akan dapat diakses dari mana saja di kelas saat ini dari paket saat ini atau di kelas turunan, bahkan jika mereka berada di paket lain;
  • default , atau pengubah yang hilang - pengubah ini digunakan secara implisit ketika pengubah akses tidak ditentukan sama sekali. Mirip dengan yang sebelumnya, hanya saja visibilitas diperbolehkan di kelas turunan yang ada di paket lain;
  • private adalah yang paling pribadi dari semua pengubah, mengizinkan akses ke elemen hanya dalam kelas saat ini.
Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 5 - 2

40. Sebutkan fitur utama metode statis dan variabel

Rumusan yang sangat aneh - “metode variabel”. Tentunya ini mengacu pada metode biasa yang non-statis. Jadi, perbedaan utamanya adalah bahwa metode statis termasuk dalam kelas dan, pada kenyataannya, metode tersebut tidak perlu membuat turunan dari kelas ini: metode ini hanya dapat dipanggil menggunakan tipe kelas. Misalnya, kami memiliki metode statis untuk mengelus kucing:
public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Погладить кота - " + cat.getName());
   }
Kita tidak memerlukan instance kelas CatService untuk memanggilnya :
Cat cat = new Cat(7, "Bobi");
CatService.petTheCat(cat);
Sementara metode biasa terikat pada (milik) suatu objek, dan untuk memanggilnya, Anda harus memiliki sebuah instance (objek) di mana metode tersebut akan dipanggil. Misalnya, seekor kucing memiliki metode non-statis - mengeong:
class Cat {
   public void mew() {
       System.out.println("Meow! Meow! Meow!");
   }
Untuk memanggil metode ini, kita memerlukan instance kucing yang spesifik:
Cat cat = new Cat(7, "Bobi");
cat.mew();

41. Apa batasan utama pada metode statis dan “variabel”?

Seperti yang saya katakan sebelumnya, batasan utama dari metode reguler adalah harus selalu ada suatu contoh di mana metode tersebut akan dipanggil. Tetapi metode statis tidak memerlukan ini, tetapi metode ini tidak dapat merujuk ke referensi this - ke elemen objek saat ini - karena objek saat ini tidak ada untuknya.

42. Apa arti kata kunci statis? Bisakah metode statis ditimpa atau kelebihan beban?

Elemen yang ditunjuk dengan kata kunci static bukan milik objek kelas, melainkan milik kelas, dan dimuat ketika kelas itu sendiri dimuat. Elemen statis adalah satu-satunya elemen untuk keseluruhan program, dan elemen reguler adalah satu-satunya elemen untuk objek tertentu. Statis dapat berupa:
  • bidang kelas;
  • blok inisialisasi kelas;
  • metode kelas;
  • kelas internal suatu kelas (namun, itu masih merupakan tautologi).
Metode statis tidak dapat ditimpa: metode ini milik kelas dan tidak diwariskan, tetapi pada saat yang sama dapat dibebani secara berlebihan.

43. Dapatkah suatu metode bersifat statis dan abstrak pada saat yang bersamaan?

Saya sudah menyebutkan ini di artikel sebelumnya: suatu metode tidak bisa abstrak dan statis pada saat yang bersamaan. Keabstrakan suatu metode berarti bahwa metode tersebut harus ditimpa pada penerusnya. Pada saat yang sama, metode statis adalah milik kelas dan tidak dapat ditimpa: ini akan menyebabkan kontradiksi, yang akan dilihat dan dikutuk oleh kompiler. Jika Anda mengalami situasi seperti ini, Anda harus serius memikirkan kebenaran arsitektur aplikasi Anda (lagipula, jelas ada yang salah dengannya).Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 5 - 3

44. Apakah mungkin menggunakan metode statis di tengah metode biasa? Dan sebaliknya? Mengapa?

Metode statis dapat digunakan secara teratur, karena tidak ada yang mencegahnya. Pada saat yang sama, situasi sebaliknya tidak mungkin terjadi: metode statis tidak dapat menggunakan metode biasa tanpa memiliki referensi ke instance spesifik dari kelas ini. Dan seperti yang kita ingat, referensi ini tidak tersedia untuk anggota kelas statis: objek spesifik kelas bisa sebanyak yang Anda inginkan, dan masing-masing objek akan memiliki referensi ke dirinya sendiri di dalamnya - this . Lalu bagaimana Anda memahami tautan mana yang perlu Anda ambil? Tapi tidak mungkin. Oleh karena itu, elemen statis tidak dapat merujuk ke elemen non-statis, tanpa referensi ke objek tertentu. Sebenarnya, metode statis dapat menggunakan metode non-statis hanya jika metode tersebut memiliki referensi ke objek tertentu. Misalnya, yang muncul sebagai argumen:
public static void petTheCat(Cat cat) {
   System.out.println("Погладить кота - " + cat.getName());
}
Di sini kita melihat bahwa metode statis petTheCat memanggil metode normal dan non-statis dari objek Cat - getName .

45. Apa itu antarmuka? Bisakah ada antarmuka terakhir?

Seingat kita, tidak ada pewarisan berganda di Java. Antarmuka adalah alternatifnya. Antarmukanya terlihat seperti kelas yang sangat sederhana. Mereka mendefinisikan fungsionalitas tanpa implementasi khusus, yang diimplementasikan oleh kelas yang mengimplementasikan (mengimplementasikan) antarmuka ini. Contoh antarmuka:
public interface Animal {
    void voice();
}
Contoh implementasi antarmuka oleh suatu kelas:
class Cat implements Animal {

   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Hal utama yang perlu Anda ketahui tentang penggunaan antarmuka adalah:
  1. Metode antarmuka hanya boleh berisi header, tanpa isi metode tertentu, mis. harus abstrak (tetapi tanpa menggunakan kata kunci abstract ). Pengecualian untuk ini adalah metode statis dan default, yang memerlukan isi metode.
  2. Sebuah kelas dapat mengimplementasikan banyak antarmuka (seperti yang saya katakan, ini adalah alternatif dari pewarisan berganda), yang ditulis dipisahkan dengan koma: class Lion mengimplementasikan Animal, Wild .
  3. Antarmuka dibuat menggunakan kata kunci - antarmuka .
  4. Saat mengimplementasikan antarmuka oleh suatu kelas, kata kuncinya adalah mengimplementasikan .
  5. Sebuah kelas yang mengimplementasikan antarmuka tertentu harus mengimplementasikan semua metode abstraknya, atau harus mendeklarasikan dirinya sebagai abstrak.
  6. Tujuan utama penggunaan antarmuka adalah untuk mengimplementasikan polimorfisme (kemampuan objek untuk mengambil berbagai bentuk).
  7. Sebagai aturan, pengubah akses untuk metode tidak ditulis di antarmuka: mereka bersifat public secara default , dan pengubah lain selain public tidak dapat ditentukan. Sejak Java 9, Anda dapat menggunakan pengubah pribadi untuk metode.
  8. Variabel antarmuka bersifat final statis secara default , dengan kata lain, konstanta: variabel tersebut selalu perlu diinisialisasi langsung di antarmuka.
  9. Anda tidak dapat membuat objek antarmuka.
Jawaban atas pertanyaan apakah antarmuka bisa bersifat final tentu saja belum. Bagaimanapun, inti dari antarmuka adalah untuk diimplementasikan. Dan seperti yang kita semua ingat dengan baik, final di tingkat kelas membuatnya tidak dapat diwariskan, dan dalam kasus antarmuka, tidak dapat diimplementasikan. Mengapa kita memerlukan antarmuka yang tidak dapat diimplementasikan dan digunakan? Itu benar - tidak perlu! Dan kompiler berpikir demikian)) Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 5 - 4Maknanya hanya muncul dengan diperkenalkannya metode statis di antarmuka dengan Java 8, tetapi ini tidak mengubah fakta bahwa antarmuka tidak bisa final. Saya berbicara tentang antarmuka, dengan sangat dangkal, karena... ini adalah topik yang luas. Baca selengkapnya tentang ini di artikel tentang antarmuka di Java dan perbedaan antara kelas abstrak dan antarmuka .

46. ​​​​Di mana saya dapat menginisialisasi bidang statis?

Bidang statis dapat diinisialisasi:
  • langsung pada saat deklarasi, melalui tanda sama dengan = ;
  • di blok inisialisasi statis;
  • di blok inisialisasi non-statis, tetapi Anda harus memahami bahwa setiap kali objek dibuat, bidang ini akan ditimpa oleh blok inisialisasi ini;
  • di konstruktor kelas. Setiap kali konstruktor ini dipanggil (yaitu, ketika sebuah objek dibuat melalui konstruktor ini), bidang ini akan ditimpa;
  • dalam metode statis;
  • dalam metode non-statis;
  • di kelas internal statis dan non-statis, lokal dan anonim.

47. Apa itu kelas anonim?

Kelas anonim adalah kelas yang tidak memiliki tipenya sendiri. Apa yang saya bicarakan? Ketika kita berbicara tentang antarmuka, saya menyebutkan bahwa Anda tidak dapat membuat objek antarmuka: Anda hanya dapat membuat objek dari kelas yang mengimplementasikan antarmuka. Bagaimana jika Anda tidak ingin mengimplementasikan antarmuka di kelas, tetapi Anda masih memerlukan objek bertipe antarmuka? Dan kemungkinan besar, ini akan menjadi satu-satunya kasus penggunaan objek ini. Dan Anda tidak perlu membuat kelas implementasi yang lengkap. Bagaimana kamu akan melakukan ini? Benar! Melalui kelas anonim! Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 5 - 5Misalkan kita mempunyai antarmuka Hewan :
public final interface Animal {
   public void voice();
}
Jika kita ingin membuat instance antarmuka ini melalui kelas anonim:
Animal cat = new Animal() {
   @Override
   public void voice() {
       System.out.println("Meow! Meow! Meow!");
   }
};
Dan kemudian Anda dapat dengan aman menggunakan objek ini dan metode penerapannya - voice . Artinya, kelas anonim mengimplementasikan antarmuka ini dan semua metode abstraknya di sini dan saat ini. Jika tidak, kita tidak akan dapat membuat objek kelas antarmuka/abstrak, karena ada metode yang belum diimplementasikan/abstrak. Seperti yang saya sebutkan, kelas anonim digunakan tidak hanya untuk mengimplementasikan metode abstrak dari suatu antarmuka, tetapi juga untuk mengimplementasikan metode abstrak dari kelas abstrak. Pendekatan ini baik untuk situasi ketika suatu objek digunakan satu kali atau implementasi metode tertentu hanya diperlukan satu kali, dan tidak perlu membuat kelas terpisah yang akan mengimplementasikan kelas/antarmuka abstrak yang diperlukan. Namun saya juga mencatat bahwa penggunaan kelas anonim jarang terjadi dalam pekerjaan: sebagai aturan, preferensi masih diberikan kepada kelas biasa. Anda dapat membaca lebih lanjut tentang kelas anonim di artikel ini .

48. Apakah kelas primitif itu?

Bagi saya, ini adalah pertanyaan yang sangat aneh dan mungkin ini adalah pertanyaan jebakan, karena di Java tidak ada yang namanya kelas primitif: kecuali mungkin konsep tipe primitif yang telah kita bahas sebelumnya. Seperti yang kita ingat, ada 8 tipe primitif di Java - byte , short , int , long , float , double , char , boolean .Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 5 - 6

49. Apa yang dimaksud dengan kelas “pembungkus”?

Masalah utama dalam menggunakan tipe primitif di Java adalah bahwa tipe tersebut masih bukan kelas, dan Java masih merupakan bahasa OOP. Artinya, program yang ditulis dalam bahasa ini direduksi menjadi interaksi antar objek. Ya, primitif bukanlah objek. Mereka tidak memiliki metode, bahkan metode standar dari kelas Object pun tidak . Nah, bagaimana jika kita perlu menggunakan primitif sebagai kunci di Map ? Maka Anda perlu memanggil metode kode hash . Anda juga dapat memanggil metode yang sama di sana . Lalu bagaimana? Ada banyak momen ketika seharusnya ada kelas, bukan primitif, yang membuat elemen primitif tidak terpakai dan tidak diinginkan dalam program, karena ini menghancurkan gagasan OOP. Namun tidak semuanya seburuk kelihatannya. Bagaimanapun, Java memiliki konsep pembungkus primitif. Setiap tipe primitif memiliki kelas analog:
  • byte -> Byte.kelas
  • pendek -> Pendek.kelas
  • int -> Integer.kelas
  • panjang -> Panjang.kelas
  • float -> Float.kelas
  • ganda -> Ganda.kelas
  • char -> Karakter.kelas
  • boolean -> Boolean.kelas
Ini adalah representasi tipe sederhana, tetapi dalam bentuk kelas lengkap dengan banyak metode yang beragam dan fungsional. Untuk kemudahan penggunaan kelas-kelas ini, konsep autoboxing dan unboxing diperkenalkan. Autoboxing - konversi otomatis dari tipe primitif ke kelas analog jika perlu (misalnya, int ke Integer ). Membuka kotak adalah proses kebalikan dari proses sebelumnya: secara otomatis mengubah kelas pembungkus primitif menjadi tipe primitif (misalnya, Integer menjadi int ). Berkat pengenalan kelas pembungkus primitif dan proses autoboxing dan unboxing , tipe primitif dapat menjadi anggota penuh bahasa OOP - Java. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 5 - 7Untuk mempelajari lebih lanjut tentang topik ini, saya sangat menyarankan membaca artikel ini .

50. Apa itu kelas Bersarang? Kapan digunakan?

Kelas bersarang adalah kelas dalam yang merupakan anggota dari kelas lain. Di Java, ada 4 tipe kelas internal seperti: 1. Kelas dalam Kelas jenis ini dideklarasikan langsung di badan kelas lain. Kelas dalam yang bersarang dapat mengakses bidang atau metode pribadi apa pun dari turunan kelas luar. Sebagai contoh, mari kita buat kebun binatang di mana kita akan memelihara hewan - zebra:
public class Zoo {
   class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Tidak ada yang rumit, bukan? Mari kita lihat contoh pembuatan objek kelas dalam:
Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.toFeed("яблоко");
Seperti yang telah Anda lihat, sangat penting untuk membuat objek kelas framing, berdasarkan referensi yang Anda dapat membuat objek kelas dalam. Saya juga ingin mencatat bahwa kelas dalam yang bersarang tidak boleh memiliki metode statis atau bidang statis. Hal ini karena kelas dalam secara implisit dikaitkan dengan objek kelas luarnya dan kelas dalam tidak dapat mendeklarasikan metode statis apa pun di dalamnya. 2. Kelas bersarang statis Kelas ini mirip dengan kelas sebelumnya, hanya saja ia memiliki pengubah akses statis di dekat deklarasi kelas. Karena kelas semacam ini tidak memiliki akses ke bidang non-statis di kelas luar, kelas ini lebih mirip bagian statis dari kelas luar daripada kelas dalam. Dalam hal ini, data kelas mempunyai akses ke semua anggota statis kelas luar, bahkan anggota pribadi. Contoh kelas bersarang statis:
public class Zoo {
   static class Zebra {
       public void toFeed(String food) {
           System.out.println("Дать зебре - " + food);
       }
   }
}
Cara pembuatannya sedikit berbeda dari yang sebelumnya:
Zoo.Zebra zebra = new Zoo.Zebra();
zebra.toFeed("яблоко");
Di sini kita tidak memerlukan objek kelas luar untuk membuat objek kelas statis bersarang. Dari kelas luar, kita hanya membutuhkan tipenya saja agar kita bisa menemukan lokasi kelas yang disarangkan. 3. Kelas lokal Kelas lokal adalah kelas yang dideklarasikan di dalam badan metode, dan pembuatan serta penggunaan objek kelas lokal hanya dimungkinkan dalam metode 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 kode metode toFeed , Anda bahkan tidak akan mencurigai keberadaan kelas lokal, bukan? Kelas lokal tidak boleh static atau transient , tetapi dapat ditandai sebagai abstract atau final (hanya OR, karena menggunakan kedua pengubah ini akan menyebabkan konflik). 4. Kelas anonim Kita telah membicarakan kelas anonim di atas, dan seperti yang Anda ingat, kelas tersebut dapat dibuat dari dua sumber - antarmuka dan kelas. Alasan penggunaan kelas statis dan non-statis internal digunakan karena terkadang lebih baik menyematkan kelas kecil ke dalam kelas yang lebih besar dan menyatukannya: dengan cara ini kelas tersebut akan memiliki penggabungan yang lebih tinggi dan tujuan yang sama. Sebenarnya, penggunaan kelas bersarang meningkatkan enkapsulasi kode. Alasan memilih kelas lokal mungkin karena kelas tertentu digunakan secara eksklusif dalam satu metode. Dalam hal ini, apakah perlu menyebarkan kode ke seluruh aplikasi? TIDAK. Tetapi pada saat yang sama saya akan menambahkan bahwa dalam praktik saya, saya belum pernah melihat penggunaan kelas lokal, karena kebutuhan akan hal-hal tersebut sangat kontroversial. Ya, alasan menggunakan kelas anonim mungkin karena implementasi spesifik dari antarmuka atau kelas abstrak hanya diperlukan satu kali, jadi tidak perlu membuat kelas terpisah dan lengkap dengan implementasi untuk ini. Sebaliknya, dengan cara yang sederhana, kami mengimplementasikan metode yang kami perlukan melalui kelas anonim, menggunakan objek ini dan melupakannya (yah, pengumpul sampah mengingatnya). Ini dan artikel iniAnalisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 5 - 8 akan membantu Anda mempelajari kelas internal secara lebih rinci .

51. Pengubah akses apa yang dapat dimiliki suatu kelas?

Seperti yang kita ingat, ada berbagai jenis kelas dan pengubah akses berbeda yang dapat diterapkan pada kelas tersebut:
  • kelas luar dapat memiliki pengubah akses publik atau tanpa pengubah (pengubah default);
  • kelas dalam mendukung keempat pengubah akses;
  • kelas statis bersarang mendukung semua pengubah akses kecuali protected , karena pengubah ini menyiratkan pewarisan, yang bertentangan dengan anggota statis kelas (elemen statis tidak diwariskan);
  • kelas lokal hanya dapat memiliki pengubah default (yaitu, tidak ada pengubah sama sekali);
  • kelas anonim : jika tidak ada deklarasi tipe kelas, maka tidak ada pengubah akses sama sekali.
Di sinilah kita akan berhenti hari ini. Sampai berjumpa lagi!Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 5 - 9
Materi lain dalam seri ini:
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION