Hai semua! Hari ini saya meneruskan ulasan saya tentang soalan temu duga pembangun Java. Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 4 - 1

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.
Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 4 - 2

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 {}
{access modifier}{static}{final}{abstract}<class name>{inheritance of Parent class}{implementation of interfaces} Jadi, apa yang kami ada: {access modifier} — hanya orang awam dan pengubah akses lalai tersedia untuk kelas. {static} — pengubah suai statik menunjukkan bahawa kelas ini adalah statik; ia hanya terpakai kepada kelas dalam (kelas di dalam kelas lain). {final} — ini ialah pengubah suai terakhir , sudah tentu, yang menjadikan kelas tidak boleh diwarisi (contoh luar kotak ialah String ). {abstract} — pengubah suai abstrak , yang menunjukkan bahawa kelas mungkin mempunyai kaedah yang tidak dilaksanakan. Pengubah suai ini bercanggah dengan pengubahsuai terakhir . Pengepala kelas hanya boleh mempunyai salah satu daripadanya kerana pengubah suai abstrak bermakna kelas itu akan diwarisi dan elemen abstraknya akan dilaksanakan. Tetapi muktamad menunjukkan bahawa ini ialah versi terakhir kelas, dan ia tidak boleh diwarisi. Sebenarnya, secara serentak menggunakan kedua-dua pengubah adalah tidak masuk akal. Pengkompil tidak akan membenarkan kami melakukan ini. <class> ialah kata kunci mandatori yang menunjukkan pengisytiharan kelas. <class name> ialah nama kelas ringkas yang menjadi pengecam kelas Java tertentu. Nama kelas yang layak sepenuhnya terdiri daripada nama pakej yang layak ditambah '.' ditambah dengan nama kelas yang mudah. {inheritance of the Parent class} ialah petunjuk kelas induk (jika ada) menggunakan kata kunci lanjutan . Sebagai contoh, ... memanjangkan ParentClass . {implementation of interfaces} — senarai antara muka yang kelas ini laksanakan (jika ada), menggunakan kata kunci implements . Contohnya: ... melaksanakan FirstInterface, SecondInterface ... Sebagai contoh, pertimbangkan tajuk kelas kelas Lion , yang mewarisi Cat dan melaksanakan antara muka WildAnimal :
public final class Lion extends Cat implements WildAnimal
Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 4 - 3

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 {}
{pengubah suai akses}{static}{abstract}{akhir}{disegerakkan} {asli} <nilai pulangan><nama kaedah> <(>{parameter kaedah}<}>{pengecualian buang} {pengubah suai akses} — semua pengubah suai akses adalah tersedia untuk kaedah — public , protected , default , private . {static} — pengubah suai statik , yang menunjukkan bahawa kaedah adalah statik dan oleh itu dikaitkan dengan kelas, bukan objek. {abstract} — pengubah suai abstrak , yang menunjukkan bahawa kaedah tidak mempunyai pelaksanaan (badan). Untuk berfungsi dengan betul, kelas yang mengisytiharkan kaedah juga mesti mempunyai pengubah abstrak . Seperti dalam pengepala kelas, pengubah ini bercanggah dengan pengubah akhir , dan juga bercanggah dengan pengubah statik , kerana kaedah abstrak membayangkan mengatasi kaedah dalam keturunan, dan kaedah statik tidak boleh ditindih. {finale} — pengubah akhir , yang menunjukkan bahawa kaedah ini tidak boleh ditindih. {synchronized} — pengubah disegerakkan , yang bermaksud kaedah itu dilindungi daripada akses serentak kepadanya dari benang yang berbeza. Jika kaedah itu tidak statik, maka ia ditutup untuk mutex objek ini. Jika kaedah itu statik, maka ia ditutup untuk mutex kelas semasa. {native} — pengubah suai asli menunjukkan bahawa kaedah itu ditulis dalam bahasa pengaturcaraan lain. <return type> — jenis nilai yang kaedah mesti kembalikan. Jika kaedah itu tidak mengembalikan apa-apa, maka batal . <nama kaedah> — nama nama kaedah, iaitu pengecamnya dalam sistem. {parameter kaedah} — parameter yang kaedah diterima: ia perlu untuk melaksanakan fungsinya. {thrown exceptions}melontar <ExceptionType> — senarai pengecualian yang disemak yang boleh dilemparkan oleh kaedah ini. Saya akan menawarkan yang berikut sebagai contoh pengepala kaedah:
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);
   }
}
Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 4 - 4

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:
  1. this() hanya berfungsi dalam pembina.
  2. 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.
Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 4 - 5

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. Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 4 - 6Sekarang 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:
  1. Medan kelas statik kelas Induk .
  2. Blok permulaan statik kelas Induk .
  3. Medan statik kelas Kanak-kanak .
  4. Blok permulaan statik kelas Kanak-kanak .
  5. Medan bukan statik kelas Induk .
  6. Blok permulaan bukan statik kelas Induk .
  7. Pembina kelas induk .
  8. Medan bukan statik bagi kelas Kanak-kanak .
  9. Blok permulaan bukan statik bagi kelas Сhild .
  10. Pembina kelas Сhild .
Meneroka soalan dan jawapan daripada temu duga kerja untuk jawatan pembangun Java.  Bahagian 4 - 7

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
Prinsip IS-A OOP adalah berdasarkan warisan kelas atau pelaksanaan antara muka. Sebagai contoh, jika kelas Singa mewarisi Cat , maka kita katakan bahawa Singa ialah Kucing :
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
Jenis perhubungan ini ialah di mana satu kelas menggunakan kelas lain, juga dipanggil "persatuan". Persatuan ialah satu kelas yang merujuk kepada kelas lain (atau rujukan bersama antara satu sama lain). Sebagai contoh, kelas Kereta boleh merujuk kelas Penumpang , yang akan membentuk perhubungan berikut:
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.