Hai semua! Hari ini saya meneruskan ulasan saya tentang soalan temu duga pembangun Java.
29. Bolehkah pulangan digunakan dalam pembina?
Ya, tetapi hanya tanpa nilai di sebelah kanan kata kunci pulangan . Anda boleh menggunakan pulangan; sebagai pernyataan pembantu dalam pembina untuk menamatkan (mengganggu) pelaksanaan kod selanjutnya dengan segera dan menyelesaikan permulaan objek. Sebagai contoh, katakan kita mempunyai kelas Cat , dan jika Kucing tiada tempat tinggal ( isHomeless = true , maka kami ingin menamatkan permulaan dan tidak mengisi medan lain (lagipun, mereka tidak diketahui oleh kami, kerana kucing itu tiada tempat tinggal) :public Cat(int age, String name, boolean isHomeless) {
if (isHomeless){
this.isHomeless = isHomeless;
return;
}
this.isHomeless = isHomeless;
this.age = age;
this.name = name;
}
Tetapi jika kita bercakap tentang nilai konkrit, maka kata kunci pulangan tidak boleh mengembalikan nilai tertentu kerana:
- apabila anda mengisytiharkan pembina, anda tidak akan mempunyai apa-apa seperti jenis pulangan;
- sebagai peraturan, pembina dipanggil secara tersirat semasa instantiasi;
- pembina bukan kaedah: ia adalah mekanisme berasingan yang tujuan utamanya adalah untuk memulakan pembolehubah contoh, iaitu, kami menggunakan operator baharu untuk mencipta objek.
30. Bolehkah pengecualian dilemparkan daripada pembina?
Pembina bekerja dengan pengecualian dengan cara yang sama seperti kaedah. Kaedah membolehkan kami membuang pengecualian dengan menulis lontaran <ExceptionType> dalam pengepala kaedah. Dan pembina membenarkan kami melakukan perkara yang sama. Apabila kita mewarisi dan mentakrifkan pembina kelas kanak-kanak, kita boleh meluaskan jenis pengecualian — contohnya, IOException -> Exception (tetapi bukan sebaliknya). Mari kita gunakan pembina kelas Cat sebagai contoh pembina yang melemparkan pengecualian. Katakan apabila kita mencipta objek, kita mahu memasukkan nama dan umur daripada konsol:public Cat() throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
this.name = reader.readLine();
this.age = Integer.parseInt(reader.readLine());
}
Oleh kerana reader.readLine() membuang IOException, kami menulisnya dalam pengepala sebagai kemungkinan pengecualian yang dilontar.
31. Apakah unsur-unsur pengepala kelas? Tulis satu contoh
Untuk menggambarkan elemen yang membentuk pengepala kelas, mari kita lihat skema kecil:- elemen wajib muncul dalam kurungan <>
- elemen pilihan ada dalam {}
public final class Lion extends Cat implements WildAnimal
32. Apakah unsur-unsur pengepala kaedah? Tulis satu contoh
Apabila mempertimbangkan elemen yang membentuk pengepala kaedah, mari kita pertimbangkan sekali lagi skema kecil:- elemen wajib muncul dalam kurungan <>
- elemen pilihan ada dalam {}
public static void main(String[] args) throws IOException
33. Cipta pembina lalai dalam kelas kanak-kanak jika satu itu belum ditakrifkan dalam kelas asas (tetapi pembina yang berbeza ditentukan)
Saya tidak pasti saya memahami sepenuhnya soalan itu, tetapi mungkin ini bermakna kita mempunyai beberapa pembina seperti ini dalam kelas induk:public Cat(int age, String name) {
this.age = age;
this.name = name;
}
Dalam kes itu, dalam kelas induk, kita pasti perlu mentakrifkan pembina yang akan memulakan induk (iaitu memanggil pembina induk):
public class Lion extends Cat {
public Lion(int age, String name) {
super(age, name);
}
}
34. Bilakah kata kunci ini digunakan?
Di Jawa, ini mempunyai dua makna yang berbeza. 1. Ia adalah rujukan kepada objek semasa, cth this.age = 9 . Iaitu, ini merujuk kepada objek di mana ia digunakan dan yang merujuk kepada kod dengan ini . Tujuan utama adalah untuk meningkatkan kebolehbacaan kod dan mengelakkan kekaburan. Sebagai contoh, jika medan contoh dan argumen kaedah mempunyai nama yang sama:public void setName(String name) {
this.name = name;
}
Iaitu, this.name ialah medan objek, manakala nama ialah parameter kaedah. Rujukan ini tidak boleh digunakan dalam kaedah statik. 2. Dalam pembina, ini boleh dipanggil seperti kaedah, contohnya this(value) . Dalam kes ini, ia akan menjadi panggilan kepada pembina lain daripada kelas yang sama. Pada asasnya, anda boleh memanggil dua pembina semasa proses mencipta objek:
public Cat(int age, String name) {
this(name);
this.age = age;
}
public Cat(String name) {
this.name = name;
}
Apabila memanggil pembina pertama untuk mencipta objek Cat , kedua-dua medan contoh akan berjaya dimulakan. Terdapat beberapa nuansa di sini:
- this() hanya berfungsi dalam pembina.
- Rujukan kepada pembina lain mesti berada di baris pertama blok pembina (badan). Ini bermakna bahawa pembina tidak boleh memanggil lebih daripada satu (lain) pembina kelasnya.
35. Apakah itu pemula?
Setakat yang saya faham, soalan ini adalah mengenai blok permulaan biasa dan statik. Mari kita ingat dahulu apa itu permulaan. Permulaan ialah penciptaan, pengaktifan, penyediaan dan definisi medan. Menyediakan program atau komponen untuk sedia untuk digunakan. Anda akan ingat bahawa apabila anda mencipta objek, pembolehubah kelas boleh dimulakan serta-merta apabila ia diisytiharkan:class Cat {
private int age = 9;
private String name = "Tom";
Atau tetapkan selepas fakta melalui pembina:
class Cat {
private int age;
private String name;
public Cat(int age, String name) {
this.age = age;
this.name = name;
}
Tetapi ada cara lain: anda boleh menetapkan pembolehubah contoh menggunakan blok permulaan, yang mengambil bentuk pendakap kerinting {} di dalam kelas, tanpa nama (seperti kaedah atau pembina tanpa nama):
class Cat {
private int age;
private String name;
{
age = 10;
name = "Tom";
}
Blok permulaan ialah sekeping kod yang dimuatkan apabila objek dicipta. Blok sedemikian biasanya digunakan untuk melakukan pengiraan kompleks tertentu yang diperlukan apabila kelas dimuatkan. Keputusan pengiraan ini boleh ditetapkan sebagai nilai pembolehubah. Sebagai tambahan kepada blok permulaan biasa, terdapat blok statik. Mereka kelihatan sama tetapi mempunyai kata kunci statik di hadapan pendakap kerinting pembukaan:
class Cat {
private static int age;
private static String name;
static{
age = 10;
name = "Tom";
}
Blok ini sama seperti yang sebelumnya. Tetapi jika yang biasa dilaksanakan apabila setiap objek dimulakan, maka objek statik dilaksanakan sekali sahaja, apabila kelas dimuatkan. Sebagai peraturan, pengiraan kompleks tertentu dilakukan dalam blok statik, digunakan untuk memulakan pembolehubah kelas statik. Sekatan yang sama dikenakan pada blok statik yang digunakan pada kaedah statik: anda tidak boleh menggunakan data bukan statik, seperti rujukan kepada objek semasa ( ini ) dalam blok statik. Sekarang kita boleh melihat susunan permulaan kelas (bersama dengan kelas induknya) untuk memahami dengan lebih baik apabila betul-betul blok permulaan digunakan.
36. Memandangkan kelas Kanak-kanak awam yang memanjangkan Induk, tulis tertib permulaan objek
Apabila memuatkan kelas Kanak-kanak , susunan permulaan adalah seperti berikut:- Medan kelas statik kelas Induk .
- Blok permulaan statik kelas Induk .
- Medan statik kelas Kanak-kanak .
- Blok permulaan statik kelas Kanak-kanak .
- Medan bukan statik kelas Induk .
- Blok permulaan bukan statik kelas Induk .
- Pembina kelas induk .
- Medan bukan statik bagi kelas Kanak-kanak .
- Blok permulaan bukan statik bagi kelas Сhild .
- Pembina kelas Сhild .
37. Apakah jenis hubungan antara kelas (objek) yang anda tahu?
Terdapat dua jenis pembolehubah dalam Java: jenis primitif dan rujukan kepada objek lengkap.- Hubungan IS-A
Lion IS-A Cat
(tetapi bukan setiap Kucing adalah Singa ) Keadaan yang sama wujud dengan antara muka. Jika kelas Lion melaksanakan antara muka WildAnimal , maka mereka juga wujud dalam hubungan:
Lion IS-A WildAnimal
- Hubungan HAS-A
Car HAS-A Passenger
Dan sebaliknya: jika Penumpang merujuk kepada Kereta , maka ini akan menjadi hubungan:
Passenger HAS-A Car
38. Apakah hubungan objek bersekutu yang anda tahu?
Pengagregatan dan komposisi tidak lebih daripada kes perkaitan khas. Pengagregatan ialah hubungan di mana satu objek adalah sebahagian daripada yang lain. Sebagai contoh, penumpang mungkin berada di dalam kereta. Lebih-lebih lagi, mungkin terdapat berbilang penumpang atau tiada langsung (dan jika kita bercakap tentang Tesla, mungkin tiada pemandu). Sebagai contoh: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();
}
}
Dalam erti kata lain, bilangan penumpang (dalam mana-mana) tidak penting bagi kami: kefungsian kelas Kereta tidak bergantung pada ini. Pengagregatan juga membayangkan bahawa apabila objek lain menggunakan satu objek, objek pertama boleh digunakan oleh objek lain. Sebagai contoh, pelajar yang sama mungkin berada dalam kedua-dua kelab mengait dan kumpulan rock dan pada masa yang sama menghadiri kelas bahasa Sepanyol. Seperti yang anda boleh bayangkan, pengagregatan ialah hubungan persekutuan yang lebih longgar antara kelas. Komposisi adalah hubungan yang lebih ketat di mana objek bukan sahaja sebahagian daripada objek lain, tetapi kerja satu objek sangat bergantung pada objek lain. Sebagai contoh, kereta mempunyai enjin. Enjin mungkin wujud tanpa kereta, tetapi ia tidak berguna di luar kereta. Dan kereta tidak boleh berfungsi tanpa enjin:
public class Car {
private Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
void startMoving() {
engine.start();
...
}
Komposisi juga membayangkan bahawa apabila objek lain menggunakan objek, objek pertama tidak boleh dimiliki oleh mana-mana objek lain. Berbalik kepada contoh kita, enjin hanya boleh dimiliki oleh satu kereta, bukan dua atau lebih pada masa yang sama. Saya rasa itu sudah cukup untuk hari ini, jadi kita akan berhenti di sini.
GO TO FULL VERSION