Halo semuanya, hari ini saya terus menganalisis 250+ pertanyaan wawancara untuk pengembang Java. Bagian analisis sebelumnya: first , second , third . Jadi mari kita lanjutkan.
<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 :
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 .
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 {}
public final class Lion extends Cat implements WildAnimal
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 {}
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);
}
}
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:
- this() hanya berfungsi di konstruktor.
- 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.
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 . Selanjutnya, 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:- Bidang statis kelas Induk .
- Blok inisialisasi statis untuk kelas Induk .
- Bidang statis kelas Anak .
- Blok inisialisasi statis untuk kelas Anak .
- Bidang non-statis dari kelas Induk .
- Bukan blok inisialisasi statis untuk kelas Induk .
- Konstruktor untuk kelas Induk .
- Bidang non-statis dari kelas Child .
- Bukan blok inisialisasi statis untuk kelas Child .
- Konstruktor kelas Anak .
37. Hubungan apa yang Anda ketahui antar kelas (objek)?
Ada dua jenis hubungan antar kelas di Java:- Hubungan IS-A
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
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. Komposisi 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.
GO TO FULL VERSION