Halo semuanya! Hari ini saya melanjutkan ulasan saya tentang pertanyaan wawancara pengembang Java.
29. Bisakah return digunakan dalam konstruktor?
Ya, tapi hanya tanpa nilai di sebelah kanan kata kunci return . Anda dapat menggunakan pengembalian; sebagai pernyataan pembantu dalam konstruktor untuk segera menghentikan (mengganggu) eksekusi kode selanjutnya dan menyelesaikan inisialisasi objek. Misalnya, kita memiliki kelas Cat , dan jika Cat adalah tunawisma ( isHomeless = true , maka kita ingin menghentikan inisialisasi dan tidak mengisi kolom lainnya (bagaimanapun juga, kolom tersebut tidak kita ketahui, karena kucing tersebut adalah 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 kita berbicara tentang nilai konkrit, maka kata kunci return tidak dapat mengembalikan nilai tertentu karena:
- ketika Anda mendeklarasikan konstruktor, Anda tidak akan memiliki tipe kembalian seperti itu;
- sebagai aturan, konstruktor dipanggil secara implisit selama pembuatan instance;
- konstruktor bukanlah sebuah metode: ia adalah mekanisme terpisah yang tujuan utamanya adalah untuk menginisialisasi variabel instan, yaitu, kita menggunakan operator baru untuk membuat sebuah objek.
30. Bisakah pengecualian dilempar dari konstruktor?
Konstruktor bekerja dengan pengecualian dengan cara yang sama seperti metode. Metode memungkinkan kita untuk melemparkan pengecualian dengan menulis lemparan <ExceptionType> di header metode. Dan konstruktor mengizinkan kita melakukan hal yang sama. Saat kita mewarisi dan mendefinisikan konstruktor kelas anak, kita dapat memperluas jenis pengecualian — misalnya, IOException -> Exception (tetapi tidak sebaliknya). Mari kita gunakan konstruktor kelas Cat sebagai contoh konstruktor yang memberikan pengecualian. Katakanlah ketika kita membuat sebuah objek, 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() memunculkan IOException, kami menuliskannya di header sebagai kemungkinan pengecualian yang diberikan.
31. Apa saja elemen header kelas? Tulis sebuah contoh
Untuk mengilustrasikan elemen-elemen yang membentuk header kelas, mari kita lihat skema kecil:- elemen wajib muncul dalam tanda kurung <>
- elemen opsional ada di {}
public final class Lion extends Cat implements WildAnimal
32. Apa saja elemen dari header metode? Tulis sebuah contoh
Saat mempertimbangkan elemen yang membentuk header metode, mari kita pertimbangkan kembali skema kecil:- elemen wajib muncul dalam tanda kurung <>
- elemen opsional ada di {}
public static void main(String[] args) throws IOException
33. Buat konstruktor default di kelas anak jika konstruktor belum ditentukan di kelas dasar (tetapi konstruktor berbeda telah ditentukan)
Saya tidak yakin saya sepenuhnya memahami pertanyaannya, tapi mungkin itu berarti kita memiliki beberapa konstruktor seperti ini di kelas induk:
public Cat(int age, String name) {
this.age = age;
this.name = name;
}
Dalam hal ini, di kelas induk, kita pasti perlu mendefinisikan konstruktor yang akan menginisialisasi induknya (yaitu memanggil konstruktor induk):
public class Lion extends Cat {
public Lion(int age, String name) {
super(age, name);
}
}
34. Kapan kata kunci ini digunakan?
Di Jawa, ini memiliki dua arti berbeda. 1. Ini adalah referensi ke objek saat ini, misalnya this.age = 9 . Artinya, this mengacu pada objek yang digunakan dan yang dirujuk oleh kode ini . Tujuan utamanya adalah untuk meningkatkan keterbacaan kode dan menghindari ambiguitas. Misalnya, jika kolom instance dan argumen metode memiliki nama yang sama:
public void setName(String name) {
this.name = name;
}
Artinya, this.name adalah bidang objek, sedangkan name adalah parameter metode. Referensi this tidak dapat digunakan dalam metode statis. 2. Di konstruktor, ini bisa disebut seperti metode, misalnya this(value) . Dalam hal ini, ini akan menjadi panggilan ke konstruktor lain dari kelas yang sama. Pada dasarnya, Anda dapat memanggil dua konstruktor selama proses pembuatan objek:
public Cat(int age, String name) {
this(name);
this.age = age;
}
public Cat(String name) {
this.name = name;
}
Saat memanggil konstruktor pertama untuk membuat objek Cat , kedua kolom instance akan berhasil diinisialisasi. Ada beberapa nuansa di sini:
- this() hanya berfungsi di konstruktor.
- Referensi ke konstruktor lain harus berada di baris pertama blok konstruktor (body). Artinya, sebuah konstruktor tidak dapat memanggil lebih dari satu konstruktor (lainnya) dari kelasnya.
35. Apa yang dimaksud dengan penginisialisasi?
Sejauh yang saya mengerti, pertanyaan ini adalah tentang blok inisialisasi biasa dan statis. Mari kita ingat dulu apa itu inisialisasi. Inisialisasi adalah pembuatan, aktivasi, persiapan, dan definisi bidang. Mempersiapkan suatu program atau komponen agar siap digunakan. Anda akan ingat bahwa ketika Anda membuat sebuah objek, variabel kelas dapat diinisialisasi segera ketika dideklarasikan:
class Cat {
private int age = 9;
private String name = "Tom";
Atau atur setelah fakta 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: Anda bisa menyetel variabel instance menggunakan blok inisialisasi, yang berbentuk kurung kurawal {} di dalam kelas, tanpa nama (seperti metode atau konstruktor tanpa nama):
class Cat {
private int age;
private String name;
{
age = 10;
name = "Tom";
}
Blok inisialisasi adalah sepotong kode yang dimuat ketika suatu objek dibuat. Blok seperti itu biasanya digunakan untuk melakukan perhitungan kompleks tertentu yang diperlukan saat suatu kelas dimuat. Hasil perhitungan tersebut dapat ditetapkan sebagai nilai variabel. Selain blok inisialisasi biasa, ada blok statis. Mereka terlihat sama tetapi memiliki kata kunci static di depan kurung kurawal pembuka:
class Cat {
private static int age;
private static String name;
static{
age = 10;
name = "Tom";
}
Blok ini sama dengan blok sebelumnya. Tetapi jika yang biasa dieksekusi ketika setiap objek diinisialisasi, maka yang statis hanya dieksekusi satu kali, ketika kelas dimuat. Sebagai aturan, perhitungan kompleks tertentu dilakukan dalam blok statis, yang digunakan untuk menginisialisasi variabel kelas statis. Pembatasan yang sama berlaku untuk blok statis yang berlaku untuk metode statis: Anda tidak dapat menggunakan data non-statis, seperti referensi ke objek saat ini ( this ) di blok statis. Sekarang kita dapat melihat urutan inisialisasi kelas (bersama dengan kelas induknya) untuk lebih memahami kapan tepatnya blok inisialisasi dipanggil.
36. Diberikan kelas Anak publik yang merupakan perluasan Induk, tuliskan urutan inisialisasi objek
Saat memuat kelas Anak , urutan inisialisasinya adalah sebagai berikut:- Bidang kelas statis dari kelas Induk .
- Blok inisialisasi statis dari kelas Induk .
- Bidang statis kelas Anak .
- Blok inisialisasi statis kelas Anak .
- Bidang non-statis dari kelas Induk .
- Blok inisialisasi non-statis dari kelas Induk .
- Konstruktor kelas induk .
- Bidang non-statis dari kelas Anak .
- Blok inisialisasi non-statis dari kelas Anak .
- Konstruktor kelas Anak .
37. Hubungan antar kelas (objek) seperti apa yang Anda ketahui?
Ada dua jenis variabel di Java: tipe primitif dan referensi ke objek lengkap.- hubungan IS-A
Lion IS-A Cat
(tetapi tidak semua Kucing adalah Singa ) Situasi yang sama juga terjadi pada antarmuka. Jika kelas Lion mengimplementasikan antarmuka WildAnimal , maka mereka juga ada dalam hubungan tersebut:
Lion IS-A WildAnimal
- Hubungan HAS-A
Car HAS-A Passenger
Dan sebaliknya: jika Passenger mempunyai referensi ke Car , maka hubungannya akan menjadi seperti ini:
Passenger HAS-A Car
38. Hubungan objek asosiatif apa yang Anda ketahui?
Agregasi dan komposisi tidak lebih dari kasus asosiasi khusus. Agregasi adalah hubungan di mana satu objek menjadi bagian dari objek lainnya. Misalnya, seorang penumpang mungkin berada di dalam mobil. Terlebih lagi, mungkin ada banyak penumpang atau tidak sama sekali (dan jika kita berbicara tentang Tesla, mungkin tidak ada pengemudi). 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("Transporting passenger - " + passenger.toString());
}
passengers.clear();
}
}
Dengan kata lain, jumlah penumpang (dalam jumlah berapa pun) tidak penting bagi kami: fungsionalitas kelas Mobil tidak bergantung pada hal ini. Agregasi juga menyiratkan bahwa ketika objek lain menggunakan satu objek, maka objek pertama dapat digunakan oleh objek lain. Misalnya, siswa yang sama mungkin tergabung dalam klub merajut dan band rock dan sekaligus menghadiri kelas bahasa Spanyol. Seperti yang dapat Anda bayangkan, agregasi adalah hubungan asosiatif yang lebih longgar antar kelas. Komposisi merupakan hubungan yang lebih erat lagi dimana suatu benda tidak hanya menjadi bagian dari benda yang lain saja, melainkan karya suatu benda sangat bergantung pada benda yang lain. Misalnya mobil mempunyai mesin. Sebuah mesin mungkin ada tanpa mobil, tapi tidak ada gunanya di luar mobil. Dan sebuah mobil tidak dapat bekerja tanpa mesin:
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
void startMoving() {
engine.start();
...
}
Komposisi juga menyiratkan bahwa ketika objek lain menggunakan suatu objek, objek pertama tidak dapat menjadi milik objek lain mana pun. Kembali ke contoh kita, sebuah mesin hanya dapat dimiliki oleh satu mobil, tidak dapat dimiliki oleh dua atau lebih mobil secara bersamaan. Saya rasa cukup untuk hari ini, jadi kita berhenti di sini.
GO TO FULL VERSION