CodeGym /Java Blog /Acak /Menjelajahi pertanyaan dan jawaban dari wawancara kerja u...
John Squirrels
Level 41
San Francisco

Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java. Bagian 5

Dipublikasikan di grup Acak
Halo halo! Pengembang Java banyak diminati saat ini. Tentu saja, saya tidak dapat memberi Anda lowongan pekerjaan, tetapi saya akan mencoba membantu Anda memperoleh pengetahuan baru dan mengisi beberapa kekosongan. Jadi mari kita lanjutkan ulasan kami tentang pertanyaan wawancara pengembang Java. Anda dapat menemukan tautan ke bagian ulasan sebelumnya di akhir artikel. Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 5 - 1

39. Apa saja pengubah akses di Java? Sebutkan nama mereka. Untuk apa mereka digunakan?

Saya sebelumnya membahas pengubah akses dalam pertanyaan tentang elemen Java yang digunakan untuk mencapai enkapsulasi. Tapi tetap saja, saya akan mengingatkan Anda. Pengubah akses di Java adalah kata kunci yang menggambarkan tingkat akses yang diberikan ke komponen Java tertentu. Pengubah akses berikut ada:
  • public — elemen yang ditandai dengan pengubah ini bersifat publik. Dengan kata lain, bidang, metode, dan kelas yang dideklarasikan dengan pengubah publik dapat dilihat oleh kelas lain baik dalam paketnya sendiri maupun dalam paket eksternal;
  • dilindungi — elemen yang ditandai dengan pengubah ini dapat diakses dari mana saja di kelasnya sendiri dalam paket saat ini atau kelas turunan, bahkan jika elemen tersebut berada dalam paket lain;
  • default (atau tidak ada pengubah sama sekali) berlaku secara implisit ketika tidak ada pengubah akses yang ditunjukkan. Ini mirip dengan yang sebelumnya, hanya saja terlihat di kelas turunan yang ditemukan di paket lain;
  • private — ini adalah pengubah yang paling pribadi. Ini memungkinkan akses ke elemen hanya dalam kelas saat ini.

40. Sebutkan ciri-ciri utama metode statis dan non-statis

Perbedaan utamanya adalah metode statis termasuk dalam suatu kelas. Faktanya, Anda tidak perlu membuat instance kelas ini — metode statis dapat dipanggil hanya dari tipe kelasnya. Misalnya, kita mempunyai metode statis untuk mengelus kucing:

public class CatService {
   public static void petTheCat(Cat cat) {
       System.out.println("Pet the cat: " + cat.getName());
   }
Kita tidak memerlukan instance kelas CatService untuk memanggilnya:

Cat cat = new Cat(7, "Bobby");
CatService.petTheCat(cat);
Sebaliknya, metode biasa terikat (milik) pada suatu objek. Untuk memanggil mereka, Anda harus memiliki sebuah instance (objek) di mana metode tersebut akan dipanggil. Misalnya, kucing kita mempunyai metode non-statis meow() :

class Cat {
   public void meow() {
       System.out.println("Meow! Meow! Meow!");
   }
Untuk memanggil metode ini, kita memerlukan instance kucing yang spesifik:

Cat cat = new Cat(7, "Bobby");
cat.meow();

41. Apa saja batasan utama yang berlaku pada metode statis dan non-statis?

Seperti yang saya katakan sebelumnya, batasan utama dari metode biasa (non-statis) adalah harus selalu ada beberapa contoh di mana metode tersebut dipanggil. Tapi metode statis tidak memerlukan ini. Selain itu, metode statis tidak dapat menggunakan referensi ini ke elemen suatu objek karena sekarang ada objek saat ini untuk metode tersebut.

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

Sebuah elemen yang ditandai dengan kata kunci static bukan milik sebuah instance dari suatu kelas melainkan milik kelas itu sendiri. Itu dimuat ketika kelas itu sendiri dimuat. Elemen statis sama untuk keseluruhan program, sedangkan elemen nonstatis hanya sama untuk objek tertentu. Elemen berikut bisa bersifat statis:
  • bidang kelas;
  • blok inisialisasi suatu kelas;
  • sebuah metode kelas;
  • kelas bersarang dari suatu kelas (tentu saja, ini juga merupakan tautologi).
Metode statis tidak dapat ditimpa: metode ini termasuk dalam kelas dan tidak diwariskan, tetapi pada saat yang sama, metode ini dapat kelebihan beban.

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

Saya sudah menjawab ini di artikel sebelumnya: suatu metode tidak bisa abstrak dan statis pada saat yang bersamaan. Jika suatu metode bersifat abstrak, itu menyiratkan bahwa metode tersebut harus ditimpa di kelas anak. Tetapi metode statis adalah milik kelas tersebut, dan tidak dapat ditimpa. Hal ini menciptakan kontradiksi, yang akan diperhatikan dan membuat kompiler kesal. Jika Anda berada dalam situasi ini, Anda harus serius memikirkan kebenaran arsitektur aplikasi Anda (petunjuk: jelas ada yang salah dengannya). Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 5 - 2

44. Bisakah metode statis digunakan di tengah metode non-statis? Dan sebaliknya? Mengapa?

Kita dapat menggunakan metode statis dalam metode non-statis. Tidak ada yang mencegah hal itu. Meskipun demikian, hal sebaliknya tidak mungkin dilakukan: metode statis tidak dapat menggunakan metode non-statis tanpa mereferensikan instance kelas tertentu. Ingat, anggota statis suatu kelas tidak memiliki akses ke referensi ini : Anda dapat memiliki objek konkret kelas sebanyak yang Anda suka, dan masing-masing objek tersebut akan berisi referensi ini , yang merupakan referensi mandiri. Lalu bagaimana cara menentukan referensi mana yang akan digunakan? Eh, kamu tidak. Itulah sebabnya elemen statis tidak bisa merujuk ke elemen non-statis tanpa referensi ke objek tertentu. Pada dasarnya, metode statis dapat menggunakan metode non-statis hanya jika metode tersebut memiliki referensi ke objek tertentu. Misalnya, yang masuk sebagai argumen metode:

public static void petTheCat(Cat cat) {
   System.out.println("Pet the cat: " + cat.getName());
}
Di sini kita melihat bahwa dalam metode statis petTheCat() memanggil getName , metode non-statis biasa dari objek Cat .

45. Apa itu antarmuka? Bisakah ada antarmuka terakhir?

Kita ingat bahwa Java tidak memiliki banyak warisan. Antarmuka adalah alternatifnya. Antarmuka seperti kelas yang sangat sederhana. Mereka mendefinisikan fungsionalitas tetapi bukan implementasi konkrit. Tugas tersebut diserahkan kepada kelas yang mengimplementasikan antarmuka ini. Contoh antarmuka:

public interface Animal {
    void speak();
}
Contoh implementasi antarmuka oleh suatu kelas

class Cat implements Animal {
 
   @Override
   public void speak() {
       System.out.println("Meow! Meow! Meow!");
   }
}
Inilah hal utama yang penting untuk diketahui tentang penggunaan antarmuka:
  1. Metode antarmuka hanya boleh berisi header. Mereka tidak boleh memiliki isi metode tertentu, yaitu harus abstrak (meskipun tidak menggunakan kata kunci abstract ). Ada pengecualian: metode statis dan metode default, yang memerlukan badan metode.

  2. Sebuah kelas dapat mengimplementasikan banyak antarmuka (seperti yang saya katakan, antarmuka adalah alternatif dari pewarisan berganda). Nama antarmuka dipisahkan dengan koma di header metode: class Lion mengimplementasikan Animal, Wild .

  3. Antarmuka dibuat menggunakan kata kunci antarmuka .

  4. Ketika sebuah kelas mengimplementasikan sebuah antarmuka, kita menggunakan kata kunci implementasi .

  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 (memberikan suatu objek kemampuan untuk mengambil berbagai bentuk).

  7. Sebagai aturan, pengubah akses untuk metode tidak ditunjukkan dalam antarmuka: mereka bersifat public secara default, dan Anda tidak dapat menentukan pengubah selain public . Dimulai dengan Java 9, Anda dapat menggunakan pengubah pribadi pada metode.

  8. Secara default, variabel antarmuka adalah static final . Dengan kata lain, mereka adalah konstanta — mereka harus selalu diinisialisasi langsung di antarmuka.

  9. Anda tidak dapat membuat instance antarmuka.

Jawaban atas pertanyaan apakah antarmuka dapat bersifat final tentu saja tidak. Memang benar, inti dari memiliki antarmuka adalah untuk mengimplementasikannya. Dan seperti yang kita semua ingat dengan baik, pengubah terakhir pada tingkat kelas membuat kelas tidak dapat diwariskan, dan dalam kasus antarmuka — tidak dapat diimplementasikan. Mengapa kita memerlukan antarmuka yang tidak dapat kita implementasikan dan gunakan? Anda benar - kami tidak akan melakukannya! Dan kompiler setuju. :) Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 5 - 3Sebenarnya, dengan diperkenalkannya metode antarmuka statis sejak Java 8, mungkin ada benarnya, tapi ini tidak mengubah fakta bahwa sebuah antarmuka tidak bisa final. Saya hanya berbicara tentang antarmuka secara dangkal, karena ini adalah topik yang luas. Untuk informasi lebih lanjut tentang ini, lihat artikel tentang antarmuka di Java dan perbedaan antara kelas abstrak dan antarmuka .

46. ​​Di mana bidang statis dapat diinisialisasi?

Bidang statis dapat diinisialisasi:
  • segera setelah deklarasi, menggunakan tanda sama dengan ( = );
  • di blok inisialisasi statis;
  • dalam blok inisialisasi non-statis (tetapi Anda perlu memahami bahwa setiap kali objek dibuat, bidang statis akan ditimpa ketika blok inisialisasi ini dijalankan;
  • dalam konstruktor kelas. Setiap kali konstruktor dipanggil (yaitu, setiap kali objek dibuat menggunakan konstruktor ini), bidang tersebut akan ditimpa;
  • dalam metode statis;
  • dalam metode non-statis;
  • di kelas statis dan non-statis, lokal, dan anonim bersarang.

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 turunan suatu objek: Anda hanya dapat membuat turunan kelas yang mengimplementasikan antarmuka. Bagaimana jika Anda tidak ingin beberapa kelas mengimplementasikan antarmuka tetapi memerlukan objek yang mengimplementasikan antarmuka? Dan ini mungkin satu-satunya kegunaan benda tersebut. Dan Anda tidak perlu membuat kelas implementasi yang lengkap. Bagaimana Anda melakukannya? Itu benar! Dengan menggunakan kelas anonim! Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 5 - 4Misalkan kita mempunyai antarmuka Hewan :

public final interface Animal {
   public void speak();
}
Jika kita ingin menggunakan kelas anonim untuk membuat instance antarmuka tertentu:

Animal cat = new Animal() {
   @Override
   public void speak() {
       System.out.println("Meow! Meow! Meow!");
   }
};
Dan kemudian, Anda dapat dengan aman menggunakan objek ini dan metode speak() yang diimplementasikannya . Dengan kata lain, kelas anonim mengimplementasikan antarmuka dan semua metode abstraknya, saat ini juga. Jika tidak, kita tidak akan dapat membuat objek kelas antarmuka/abstrak karena akan ada metode yang tidak diterapkan/abstrak. Seperti yang saya sebutkan, kelas anonim digunakan tidak hanya untuk mengimplementasikan metode abstrak antarmuka tetapi juga untuk mengimplementasikan metode abstrak dari kelas abstrak. Pendekatan ini baik untuk situasi ketika suatu objek digunakan satu kali atau ketika implementasi metode tertentu hanya diperlukan satu kali. Tidak perlu membuat kelas terpisah yang akan mengimplementasikan kelas/antarmuka abstrak yang diperlukan. Namun saya juga mencatat bahwa kelas anonim jarang digunakan dalam pekerjaan. Biasanya, kelas biasa masih diutamakan. Anda dapat membaca lebih lanjut tentang kelas anonim di artikel ini .

48. Apakah kelas primitif itu?

Saya pikir ini adalah pertanyaan yang menyesatkan, mungkin pertanyaan jebakan, karena Java tidak memiliki kelas primitif. Yang ada hanyalah konsep tipe primitif, yang telah kita bahas sebelumnya. Kita ingat bahwa Java memiliki 8 tipe primitif: byte , short , int , long , float , double , char , boolean .

49. Apa yang dimaksud dengan kelas pembungkus?

Masalah utama dalam menggunakan tipe primitif di Java adalah bahwa mereka bukan kelas, dan Java adalah bahasa OOP. Artinya, program yang ditulis dalam bahasa ini merupakan interaksi antar objek. Tapi primitif bukanlah objek. Mereka tidak memiliki metode, bahkan metode standar kelas Object . Namun bagaimana jika kita perlu menggunakan primitif sebagai kunci dalam Map ? Lalu kita perlu memanggil metode hashCode() -nya . Anda juga dapat memanggil metode equal() di sana. Lalu bagaimana? Ada banyak sekali momen di mana Anda membutuhkan kelas, bukan primitif. Hal ini membuat elemen primitif tidak dapat digunakan dan tidak diinginkan dalam suatu program karena melanggar gagasan OOP. Namun situasinya tidak seburuk kelihatannya. Bagaimanapun, Java memiliki konsep pembungkus primitif. Di Java, setiap tipe primitif memiliki kelas kembaran — kelas wrapper.
  • byte -> Byte.kelas
  • pendek -> Pendek.kelas
  • int -> Integer.kelas
  • panjang -> Panjang.kelas
  • float -> Float.kelas
  • ganda -> Ganda.kelas
  • char -> Karakter.kelas
  • boolean -> Boolean.kelas
Tipe-tipe ini mewakili tipe-tipe sederhana, tetapi dalam kelas-kelas lengkap dengan sekumpulan metode yang bervariasi dan bermanfaat. Konsep autoboxing dan unboxing diperkenalkan agar kelas-kelas ini dapat digunakan dengan nyaman. Autoboxing adalah konversi otomatis tipe primitif ke kelas analognya, jika perlu (misalnya, mengonversi int ke Integer ). Membuka kotak adalah proses sebaliknya: konversi otomatis kelas pembungkus primitif ke tipe primitif (misalnya, mengonversi Integer menjadi int ). Berkat pengenalan kelas wrapper primitif dan proses autoboxing dan unboxing , tipe primitif sekarang menjadi anggota penuh Java sebagai bahasa OOP. Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 5 - 5Untuk pembahasan lebih mendalam mengenai topik ini, saya sangat menyarankan untuk membaca artikel ini .

50. Apa yang dimaksud dengan kelas bersarang? Di mana itu digunakan?

Kelas bersarang adalah kelas yang merupakan anggota dari kelas lain. Ada 4 macam kelas bersarang di Java: 1. Kelas dalam Kelas jenis ini dideklarasikan langsung di badan kelas lain. Kelas dalam adalah kelas bersarang non-statis dan dapat mengakses bidang privat atau metode instan apa pun dari kelas luar. Sebagai contoh, mari kita buat kebun binatang yang berisi seekor binatang — zebra:

public class Zoo {
   class Zebra {
       public void eat(String food) {
           System.out.println("Zebra eats " + food);
       }
   }
}
Tidak rumit, bukan? Mari kita lihat contoh pembuatan instance kelas dalam:

Zoo.Zebra zebra = new Zoo().new Zebra();
zebra.eat("apple");
Seperti yang telah Anda lihat, pertama-tama perlu membuat objek dari kelas yang melingkupinya. Kemudian Anda menggunakan referensi objek untuk membuat instance kelas dalam. Saya juga ingin menunjukkan bahwa kelas dalam (kelas bersarang non-statis) tidak boleh memiliki metode statis atau bidang statis. Hal ini justru karena kelas dalam secara implisit dikaitkan dengan turunan dari kelas luarnya, dan oleh karena itu tidak dapat mendeklarasikan metode statis apa pun di dalamnya. 2. Kelas bersarang statis Kelas-kelas ini mirip dengan kategori sebelumnya, tetapi mereka memiliki pengubah akses statis dalam deklarasi kelas. Karena kelas semacam ini tidak memiliki akses ke bidang non-statis di kelas luar, kelas ini lebih terlihat seperti bagian statis dari kelas luar daripada kelas dalam. Tetapi kelas ini memiliki akses ke semua anggota statis kelas luar, bahkan anggota privat. Contoh kelas bersarang statis:

public class Zoo {
   static class Zebra {
       public void eat(String food) {
           System.out.println("Zebra eats " + food);
       }
   }
}
Itu dibuat sedikit berbeda dari yang sebelumnya:

Zoo.Zebra zebra = new Zoo.Zebra();
zebra.eat("apple");
Di sini kita tidak memerlukan objek kelas luar untuk membuat objek kelas bersarang statis. Kita hanya perlu mengetahui nama kelas yang disarangkan untuk menemukannya di dalam kelas luar. 3. Kelas lokal Kelas lokal adalah kelas yang dideklarasikan di dalam badan suatu metode. Objek kelas lokal hanya dapat dibuat dan digunakan dalam metode penutup. Contoh:

public class Zoo {
   public void feed(String animal, String food) {
       switch(animal) {
           case "zebra":
               class Zebra {
                   public void eat(String food) {
                       System.out.println("Zebra eats " + food);
                   }
               }
               Zebra zebra = new Zebra();
               zebra.eat(food);
               ...
Berikut ini contohnya:

Zoo zoo = new Zoo();
zoo.feed("zebra", "apple");
Jika Anda tidak melihat kode untuk metode feed() , Anda bahkan tidak akan curiga bahwa ada kelas lokal, bukan? Kelas lokal tidak boleh statis atau sementara , tetapi dapat ditandai sebagai abstrak atau final (satu ATAU yang lain, tetapi tidak keduanya, karena penggunaan kedua pengubah ini secara bersamaan akan menimbulkan konflik). 4. Kelas anonim Kita telah membicarakan tentang kelas anonim di atas, dan seperti yang Anda ingat, kelas tersebut dapat dibuat dari dua sumber — antarmuka dan kelas. Alasan untuk menggunakannya Kelas statis dan non-statis tersarang digunakan karena terkadang lebih baik untuk menyematkan kelas-kelas kecil dalam kelas-kelas yang lebih umum dan menyatukannya sehingga mereka memiliki kohesi yang lebih tinggi dan tujuan yang sama. Pada dasarnya, kelas bersarang memungkinkan Anda meningkatkan enkapsulasi kode Anda. Anda mungkin memilih untuk menggunakan kelas lokal jika kelas tersebut digunakan secara eksklusif dalam satu metode. Dalam hal ini, apakah kita perlu menyebarkan kode ke seluruh aplikasi? Tidak. Karena itu, saya akan menambahkan bahwa dalam pengalaman saya, saya belum pernah melihat orang menggunakan kelas lokal, karena diperlukan atau tidaknya kelas tersebut sangat kontroversial. Anda mungkin menggunakan kelas anonim ketika implementasi spesifik antarmuka atau kelas abstrak hanya diperlukan satu kali. Dalam hal ini, tidak perlu membuat kelas terpisah dan lengkap dengan sebuah implementasi. Sebaliknya, kami membuatnya tetap sederhana dan mengimplementasikan metode yang kami perlukan menggunakan kelas anonim, menggunakan objek tersebut, dan kemudian melupakannya (tentu saja, pemulung tidak melupakannya). Pemahaman Anda tentang kelas bersarang akan ditingkatkan dengan artikel di sini.

51. Pengubah akses apa yang dapat dimiliki suatu kelas?

Ada berbagai jenis kelas dan pengubah akses berbeda yang berlaku untuk kelas tersebut:
  • kelas luar dapat memiliki pengubah akses publik atau tidak memiliki pengubah sama sekali (pengubah default);
  • kelas dalam (kelas bersarang non-statis) dapat memiliki salah satu dari 4 pengubah akses;
  • kelas statis bersarang dapat memiliki salah satu pengubah akses kecuali dilindungi karena pengubah ini menyiratkan pewarisan, yang bertentangan dengan anggota kelas statis mana pun (anggota statis tidak diwariskan);
  • kelas lokal hanya dapat memiliki pengubah default (yaitu tidak ada pengubah sama sekali);
  • kelas anonim tidak memiliki deklarasi kelas, sehingga tidak memiliki pengubah akses sama sekali.
Di sinilah kita akan mengakhiri hari ini. Sampai berjumpa lagi!Menjelajahi pertanyaan dan jawaban dari wawancara kerja untuk posisi pengembang Java.  Bagian 5 - 6
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION