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

Analisis tanya jawab dari wawancara untuk pengembang Java. Bagian 4

Dipublikasikan di grup Random-ID
Halo semuanya, hari ini saya terus menganalisis 250+ pertanyaan wawancara untuk pengembang Java. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 4 - 1Bagian analisis sebelumnya: first , second , third . Jadi mari kita lanjutkan.

29. Apakah mungkin menggunakan return dalam konstruktor?

Anda bisa, tetapi tanpa nilai kembalian di sebelah kanan return . Artinya, Anda bisa menggunakan return; sebagai konstruksi tambahan selama perhitungan di konstruktor untuk segera menyelesaikan (menginterupsi) eksekusi kode selanjutnya dan menyelesaikan inisialisasi objek. Misalnya, kita memiliki kelas Cat , dan jika Cat adalah tunawisma - isHomeless = true , kita harus menyelesaikan inisialisasi dan tidak mengisi kolom lain (bagaimanapun, kolom tersebut tidak kita ketahui, karena kucing tersebut tunawisma):
public Cat(int age, String name, boolean isHomeless) {
   if (isHomeless){
       this.isHomeless = isHomeless;
       return;
   }
   this.isHomeless = isHomeless;
   this.age = age;
   this.name = name;
}
Namun jika menyangkut nilai tertentu, konstruktor tidak dapat menggunakan return untuk mengembalikan nilai karena:
  • saat mendeklarasikan konstruktor, Anda tidak akan memiliki apa pun yang menyerupai tipe pengembalian;
  • Biasanya, konstruktor dipanggil secara implisit selama pembuatan instance;
  • Konstruktor bukanlah sebuah metode: ini adalah mekanisme terpisah yang tujuan utamanya adalah menginisialisasi variabel instan, dan operator baru bertanggung jawab untuk membuat objek .
Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 4 - 2

30. Apakah mungkin untuk mengeluarkan pengecualian dari konstruktor?

Konstruktor menangani pengecualian dengan cara yang persis sama seperti metode. Dan jika metode mengizinkan kita untuk melempar pengecualian dengan menulis throws <ExceptionType> di header metode , maka konstruktor mengizinkan kita melakukan ini, dan juga saat mewarisi dan mendefinisikan konstruktor pewaris, kita dapat memperluas jenis pengecualian. Misalnya, IOException -> Exception (tetapi tidak sebaliknya). Sebagai contoh untuk melemparkan pengecualian oleh konstruktor, mari kita ambil kelas Cat . Katakanlah saat membuatnya kita ingin memasukkan nama dan umur dari konsol:
public Cat() throws IOException {
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   this.name = reader.readLine();
   this.age = Integer.parseInt(reader.readLine());
}
Karena reader.readLine() menampilkan IOException, kami menetapkannya di header sebagai kemungkinan pengecualian yang diberikan.

31. Terdiri dari elemen apa saja header kelas? Tulis sebuah contoh

Berbicara tentang elemen-elemen yang membentuk header kelas, mari kita lihat diagram kecilnya:
  • komponen wajib ada dalam tanda kurung <>
  • opsional - di {}
{pengubah akses kelas}{statisitas kelas}{finalitas kelas}{abstraksi kelas} <nama kelas>{warisan dari kelas Induk} {implementasi antarmuka} Jadi, yang kita punya: {class access modifier} - hanya pengubah publik dan pengubah akses yang hilang, yaitu default , yang tersedia untuk class . {class static} - static adalah pengubah yang menunjukkan bahwa kelas ini statis, hanya berlaku untuk kelas dalam (kelas di dalam kelas lain). {class finality} - seperti yang kita ingat, ini adalah pengubah terakhir , yang dengannya kelas menjadi tidak dapat diwariskan (contoh dari kotak - String ). {class abstraction} - modifier - abstract , yang menunjukkan bahwa kelas ini mungkin memiliki metode yang belum diterapkan. Pengubah ini bertentangan dengan pengubah akhir , yaitu hanya satu yang dapat berada di header kelas, karena pengubah abstrak menyiratkan bahwa kelas tertentu akan diwarisi dan bagian abstraknya akan diimplementasikan. Dan final menunjukkan bahwa ini adalah versi final (final) dari kelas tersebut, dan tidak dapat diwariskan. Sebenarnya, menggunakan kedua pengubah pada saat yang sama tidak masuk akal, dan kompiler tidak akan mengizinkan kita melakukan hal ini. <class> adalah kata kunci wajib yang menunjukkan deklarasi kelas. <nama kelas> adalah nama kelas sederhana, yang merupakan pengidentifikasi kelas Java tertentu. Nama kelas yang sepenuhnya memenuhi syarat terdiri dari nama paket yang sepenuhnya memenuhi syarat + . + nama kelas sederhana. {inheritance from Parent class} - menentukan kelas induk (jika ada) menggunakan kata kunci extends . Misalnya, .. memperluas ParentClass . {implementasi antarmuka} - menentukan antarmuka yang diimplementasikan oleh kelas ini (jika ada) menggunakan kata kunci implementasi . Misalnya: ... mengimplementasikan FirstInterface, SecondInterface ... Nah, sebagai contoh header kelas, pertimbangkan header kelas Lion , yang mewarisi dari Cat dan mengimplementasikan antarmuka WildAnimal :
public final class Lion extends Cat implements WildAnimal
Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 4 - 3

32. Terdiri dari elemen apa header metode? Tulis sebuah contoh

Sekali lagi, ketika melihat elemen yang membentuk header metode, pertimbangkan diagram kecil di mana:
  • komponen wajib ada dalam tanda kurung <>
  • opsional - di {}
{pengubah akses}{metode statis}{abstraksi metode}{finalitas metode}{pengubah sinkronisasi} {pengubah asli<nilai kembali><nama metode> <(> {argumen metode} <)>{pengecualian yang diberikan} {pengubah akses } — semua pengubah akses tersedia untuk metode ini: public , protected , default , private . {method static} - static adalah pengubah yang menunjukkan bahwa metode ini statis, yaitu tidak terikat pada objek, tetapi pada kelas. {method abstraction} adalah pengubah abstrak , yang menunjukkan bahwa tidak ada implementasi (body) dari metode tersebut. Untuk pengoperasian yang benar, Anda juga memerlukan pengubah abstrak untuk kelas tempat metode ini disediakan. Seperti pada header kelas, pengubah ini bertentangan dengan pengubah akhir , tetapi selain itu juga bertentangan dengan pengubah statis , karena metode abstrak menyiratkan penggantian metode pada turunannya, dan metode statis tidak diganti. {finalitas metode} - final - pengubah yang menunjukkan bahwa metode ini tidak dapat ditimpa. {pengubah sinkronisasi} - tersinkronisasi - pengubah yang berarti bahwa metode ini dilindungi dari akses simultan dari thread yang berbeda. Jika metode ini tidak statis, metode ini akan menutup mutex objek ini. Jika metodenya statis, metode ini akan ditutup pada mutex kelas saat ini. {native modifier} - asli - pengubah ini menunjukkan bahwa metode ini ditulis dalam bahasa pemrograman yang berbeda. <return value> adalah tipe nilai yang harus dikembalikan oleh metode. Jika tidak mengembalikan apa pun, batalkan . <nama metode> adalah nama metode, pengenalnya dalam sistem. {argumen metode} adalah argumen (parameter) yang digunakan metode: argumen tersebut diperlukan untuk mengimplementasikan fungsinya. {pengecualian yang dapat dilempar} - throwsExceptionType - daftar pengecualian yang dicentang yang dapat dilempar oleh metode ini. Dan sebagai contoh header metode, saya akan memberikan ini:
public static void main(String[] args) throws IOException

33. Buat konstruktor default di objek turunan jika tidak ditentukan di objek dasar (tetapi konstruktor lain ditentukan)

Saya tidak sepenuhnya memahami pertanyaan itu sendiri, tapi mungkin itu berarti, misalnya, di induk kami memiliki beberapa konstruktor khusus:
public Cat(int age, String name) {
   this.age = age;
   this.name = name;
}
Oleh karena itu, pada kelas leluhur, kita pasti perlu mendefinisikan konstruktor yang akan mengisi (memanggil) konstruktor induk:
public  class Lion extends Cat {

   public Lion(int age, String name) {
       super(age, name);
   }
}
Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 4 - 4

34. Kapan kata kunci ini digunakan?

Di Jawa, ini memiliki dua arti berbeda. 1. Sebagai referensi objek saat ini, seperti this.age = 9 . Artinya, this mengacu pada objek yang dipanggil dan ke mana kode yang menggunakan this merujuk . Fungsi utamanya adalah untuk meningkatkan keterbacaan kode dan menghindari ambiguitas. Misalnya, jika nama field kelas internal dan argumen metodenya sama:
public void setName(String name) {
   this.name = name;
}
Artinya, this.name adalah bidang nama objek yang merupakan argumen metode. Referensi this tidak dapat digunakan dalam metode statis. 2. ini dapat digunakan dalam konstruktor dalam bentuk pemanggilan metode, seperti this(value) . Dalam hal ini, ini akan menjadi panggilan ke konstruktor lain dari kelas yang sama. Singkatnya, Anda dapat memanggil dua konstruktor sekaligus saat membuat objek:
public Cat(int age, String name) {
   this(name);
   this.age = age;
}

public Cat(String name) {
   this.name = name;
}
Ketika objek Cat dibuat dan konstruktor pertama dipanggil, kedua bidang objek tersebut akan dipanggil dan berhasil diinisialisasi. Ada beberapa nuansa:
  1. this() hanya berfungsi di konstruktor.
  2. Referensi ke konstruktor lain harus berada di baris pertama blok konstruktor (body). Oleh karena itu, lebih dari satu konstruktor (lainnya) dari kelas tertentu tidak dapat dipanggil dalam satu konstruktor.
Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 4 - 5Contoh lainnya ada di artikel ini .

35. Apa yang dimaksud dengan penginisialisasi?

Sejauh yang saya mengerti, dalam pertanyaan ini kita berbicara tentang blok inisialisasi biasa dan statistik. Pertama, mari kita ingat apa itu inisialisasi. Inisialisasi adalah pembuatan, aktivasi, persiapan kerja, penentuan parameter. Membawa suatu program atau komponen ke dalam kondisi siap digunakan. Seperti yang Anda ingat, selama pembuatan objek, variabel kelas dapat diinisialisasi langsung setelah deklarasi:
class Cat {
   private int age = 9;
   private  String name = "Tom";
Atau atur secara eksternal melalui konstruktor:
class Cat {
   private int age;
   private  String name;

   public Cat(int age, String name) {
       this.age = age;
       this.name = name;
   }
Namun ada cara lain: menyetel variabel objek internal melalui blok inisialisasi, yang terlihat seperti kurung kurawal {} di dalam kelas, tanpa nama (seperti metode atau konstruktor):
class Cat {
   private int age;
   private  String name;

   {
       age = 10;
       name = "Tom";
   }
Artinya, blok inisialisasi adalah sepotong kode yang dimuat ketika suatu objek dibuat. Biasanya, blok tersebut digunakan untuk melakukan beberapa perhitungan rumit yang diperlukan saat memuat kelas. Hasil perhitungan tersebut dapat ditetapkan sebagai nilai variabel. Selain itu, selain blok inisialisasi biasa, ada juga blok statis, yang terlihat sama, tetapi memiliki kata kunci static sebelum kurung kurawal :
class Cat {
   private static int age;
   private static String name;

   static{
       age = 10;
       name = "Tom";
   }
Blok ini sama persis dengan blok sebelumnya. Tetapi jika yang biasa dipicu ketika setiap objek diinisialisasi, maka yang statis hanya akan terpicu satu kali, ketika kelas dimuat. Di blok seperti itu, sebagai suatu peraturan, beberapa perhitungan kompleks juga dilakukan untuk inisialisasi variabel kelas statis selanjutnya. Pembatasan yang sama berlaku untuk blok statis seperti halnya metode statis: blok tersebut tidak dapat menggunakan data non-statis, serta referensi ke objek saat ini - this . Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 4 - 6Selanjutnya, kita dapat melihat urutan inisialisasi kelas (bersama dengan leluhurnya) untuk lebih memahami momen ketika blok inisialisasi dipicu.

36. Untuk mewarisi kelas public class Child extends Parent, tuliskan urutan inisialisasi objeknya

Ketika kelas Anak dimuat, urutan inisialisasinya adalah sebagai berikut:
  1. Bidang statis kelas Induk .
  2. Blok inisialisasi statis untuk kelas Induk .
  3. Bidang statis kelas Anak .
  4. Blok inisialisasi statis untuk kelas Anak .
  5. Bidang non-statis dari kelas Induk .
  6. Bukan blok inisialisasi statis untuk kelas Induk .
  7. Konstruktor untuk kelas Induk .
  8. Bidang non-statis dari kelas Child .
  9. Bukan blok inisialisasi statis untuk kelas Child .
  10. Konstruktor kelas Anak .
Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 4 - 7Berikut artikel singkat yang menjelaskan urutan inisialisasi dalam praktiknya.

37. Hubungan apa yang Anda ketahui antar kelas (objek)?

Ada dua jenis hubungan antar kelas di Java:
  • Hubungan IS-A
Prinsip IS-A dalam OOP didasarkan pada pewarisan kelas atau implementasi antarmuka. Misalnya, jika kelas Lion mewarisi dari Cat , kita katakan bahwa Lion adalah Cat :
Lion IS-A Cat
(tetapi tidak semua Kucing adalah Singa ) Situasinya persis sama dengan antarmuka. Jika kelas Lion mengimplementasikan antarmuka WildAnimal , maka mereka juga berada dalam relasi:
Lion IS-A WildAnimal
  • hubungan HAS-A
Jenis hubungan ini didasarkan pada penggunaan kelas oleh kelas lain, disebut juga “asosiasi”. Asosiasi adalah satu kelas yang mereferensikan kelas lain (atau bahkan satu sama lain). Misalnya, kelas Car bisa merujuk ke kelas Passenger , dan ini akan menjadi hubungannya:
Car HAS-A Passenger
Dan sebaliknya: jika Passenger mempunyai referensi ke Car , maka relasinya akan seperti ini:
Passenger HAS-A Car

38. Hubungan asosiatif antar objek apa yang kamu ketahui?

Agregasi dan komposisi tidak lebih dari kasus asosiasi khusus. Agregasi adalah hubungan di mana satu objek menjadi bagian dari objek lain. Misalnya, seorang penumpang mungkin berada di dalam mobil. Selain itu, mungkin ada beberapa penumpang atau tidak sama sekali (jika kita berbicara tentang Tesla, maka pengemudi tidak diperlukan). Misalnya:
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();
   }
}
Artinya, kami tidak peduli dengan jumlah penumpang (atau apakah ada penumpang sama sekali): fungsionalitas kelas Mobil tidak bergantung pada hal ini. Agregasi juga menyiratkan bahwa ketika suatu objek digunakan oleh objek lain, objek pertama dapat digunakan pada objek lain. Misalnya, siswa yang sama dapat menjadi anggota klub merajut dan grup musik rocker, dan pada saat yang sama bergabung dengan grup pembelajar bahasa Inggris. Seperti yang Anda pahami, agregasi adalah hubungan asosiatif yang lebih longgar antar kelas. Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 4 - 8Komposisi merupakan suatu hubungan yang lebih kaku lagi apabila suatu benda tidak hanya merupakan bagian dari benda yang lain, melainkan hasil karya benda yang lain itu sangat bergantung pada benda yang pertama. Misalnya saja mesin mobil. Meskipun mesin mungkin ada tanpa mobil, namun tidak ada gunanya di luar mobil. Ya, mobil tidak bisa berjalan tanpa mesin:
public class Car {
   private Engine engine;

   public Car(Engine engine) {
       this.engine = engine;
   }

   void startMoving() {
       engine.start();
           ...
   }
Komposisi juga mengandung arti bahwa bila suatu benda digunakan oleh benda lain, maka benda yang pertama tidak boleh menjadi milik orang lain. Jika kita kembali ke contoh kita, sebuah mesin hanya dapat dimiliki oleh satu mobil, tetapi tidak dapat dimiliki oleh dua atau lebih mobil secara bersamaan. Kami mungkin akan berhenti di sini hari ini.Analisis tanya jawab dari wawancara untuk pengembang Java.  Bagian 4 - 9
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION