JavaRush /Blog Java /Random-MS /Analisis soalan dan jawapan daripada temu bual untuk pemb...

Analisis soalan dan jawapan daripada temu bual untuk pembangun Java. Bahagian 14

Diterbitkan dalam kumpulan
Bunga api! Dunia sentiasa bergerak dan kita sentiasa bergerak. Sebelum ini, untuk menjadi pembangun Java, cukup untuk mengetahui sedikit sintaks Java, dan selebihnya akan datang. Dari masa ke masa, tahap pengetahuan yang diperlukan untuk menjadi pembangun Java telah berkembang dengan ketara, begitu juga dengan persaingan, yang terus melonjakkan bar bawah pengetahuan yang diperlukan ke atas. Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 14 - 1Jika anda benar-benar ingin menjadi pembangun, anda perlu mengambil mudah dan bersedia dengan teliti untuk menonjol dalam kalangan pemula seperti anda. Apa yang akan kami lakukan hari ini, iaitu, kami akan terus menganalisis 250+ soalan . Dalam artikel sebelumnya, kami telah meneliti semua soalan peringkat rendah, dan hari ini kami akan mengambil soalan peringkat pertengahan. Walaupun saya perhatikan bahawa ini bukan 100% soalan peringkat pertengahan, anda boleh menemui kebanyakannya pada temu duga peringkat rendah, kerana pada temu duga sedemikianlah penyelidikan terperinci tentang asas teori anda berlaku, manakala bagi pelajar pertengahan soalan lebih tertumpu kepada meneliti pengalamannya . Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 14 - 2Tetapi, tanpa berlengah lagi, mari kita mulakan.

Tengah

Adalah biasa

1. Apakah kelebihan dan kekurangan OOP jika dibandingkan dengan pengaturcaraan prosedural/fungsional?

Terdapat soalan ini dalam analisis soalan untuk Juinior, dan dengan itu saya sudah menjawabnya. Cari soalan ini dan jawapannya dalam bahagian artikel ini , soalan 16 dan 17.

2. Bagaimanakah pengagregatan berbeza daripada gubahan?

Dalam OOP, terdapat beberapa jenis interaksi antara objek, bersatu di bawah konsep umum "Has-A Relationship". Hubungan ini menunjukkan bahawa satu objek adalah komponen objek lain. Pada masa yang sama, terdapat dua subjenis perhubungan ini: Komposisi - satu objek mencipta objek lain dan jangka hayat objek lain bergantung pada hayat pencipta. Pengagregatan - objek menerima pautan (penunjuk) ke objek lain semasa proses pembinaan (dalam kes ini, jangka hayat objek lain tidak bergantung pada hayat pencipta). Untuk pemahaman yang lebih baik, mari kita lihat contoh khusus. Kami mempunyai kelas kereta tertentu - Car , yang seterusnya mempunyai medan dalaman jenis - Enjin dan senarai penumpang - List<Passenger> , ia juga mempunyai kaedah untuk memulakan pergerakan - startMoving() :
public class Car {

 private Engine engine;
 private List<Passenger> passengers;

 public Car(final List<Passenger> passengers) {
   this.engine = new Engine();
   this.passengers = passengers;
 }

 public void addPassenger(Passenger passenger) {
   passengers.add(passenger);
 }

 public void removePassengerByIndex(Long index) {
   passengers.remove(index);
 }

 public void startMoving() {
   engine.start();
   System.out.println("Машина начала своё движение");
   for (Passenger passenger : passengers) {
     System.out.println("В машине есть пассажир - " + passenger.getName());
   }
 }
}
Dalam kes ini, Komposisi ialah sambungan antara Kereta dan Enjin , kerana prestasi kereta secara langsung bergantung pada kehadiran objek enjin, kerana jika enjin = null , maka kita akan menerima NullPointerException . Sebaliknya, enjin tidak boleh wujud tanpa mesin (mengapa kita memerlukan enjin tanpa mesin?) dan tidak boleh dimiliki oleh beberapa mesin pada satu masa. Ini bermakna jika kita memadamkan objek Kereta , tiada lagi rujukan kepada objek Enjin , dan ia akan dipadamkan oleh Pemungut Sampah tidak lama lagi . Seperti yang anda lihat, hubungan ini sangat ketat (kuat). Pengagregatan ialah sambungan antara Kereta dan Penumpang , memandangkan prestasi Kereta sama sekali tidak bergantung pada objek jenis Penumpang dan nombornya. Mereka boleh sama ada meninggalkan kereta - removePassengerByIndex(Long index) atau masukkan yang baharu - addPassenger(Passenger passenger) , walaupun begitu, kereta akan terus berfungsi dengan baik. Sebaliknya, objek Penumpang boleh wujud tanpa objek Kereta . Seperti yang anda faham, ini adalah sambungan yang jauh lebih lemah daripada yang kita lihat dalam komposisi. Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 14 - 3Tetapi bukan itu sahaja, objek yang disambungkan dengan pengagregatan kepada yang lain juga boleh mempunyai sambungan yang diberikan dengan objek lain pada masa yang sama. Sebagai contoh, anda, sebagai pelajar Java, didaftarkan dalam kursus Bahasa Inggeris, OOP dan logaritma pada masa yang sama, tetapi pada masa yang sama anda bukanlah sebahagian daripada mereka yang sangat diperlukan, tanpanya fungsi normal adalah mustahil (seperti seorang guru).

3. Apakah corak GoF yang telah anda gunakan dalam amalan? Beri contoh.

Saya telah pun menjawab soalan ini sebelum ini, jadi saya hanya tinggalkan pautan kepada analisis , lihat soalan pertama. Saya juga menjumpai artikel helaian helaian yang menarik tentang corak reka bentuk, yang saya sangat mengesyorkan agar disimpan di tangan.

4. Apakah objek proksi? Beri contoh

Proksi ialah corak reka bentuk struktur yang membolehkan anda menggantikan objek pengganti khas, atau dengan kata lain, objek proksi, bukannya objek sebenar. Objek proksi ini memintas panggilan ke objek asal, membenarkan beberapa logik untuk dimasukkan sebelum atau selepas panggilan dihantar kepada asal. Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 14 - 4Contoh menggunakan objek proksi:
  • Sebagai proksi jauh - digunakan apabila kita memerlukan objek jauh (objek dalam ruang alamat yang berbeza) yang perlu diwakili secara tempatan. Dalam kes ini, proksi akan mengendalikan penciptaan sambungan, pengekodan, penyahkodan, dsb., manakala pelanggan akan menggunakannya seolah-olah ia adalah objek asal yang terletak di ruang tempatan.

  • Sebagai proksi maya - digunakan apabila objek intensif sumber diperlukan. Dalam kes ini, objek proksi berfungsi sebagai sesuatu seperti imej objek sebenar yang sebenarnya belum wujud lagi. Apabila permintaan sebenar (panggilan kaedah) dihantar ke objek ini, barulah objek asal dimuatkan dan kaedah dilaksanakan. Pendekatan ini juga dipanggil pemula malas; ini boleh menjadi sangat mudah, kerana dalam beberapa situasi objek asal mungkin tidak berguna, dan kemudian tidak akan ada kos untuk menciptanya.

  • Sebagai proksi keselamatan - digunakan apabila anda perlu mengawal akses kepada beberapa objek berdasarkan hak klien. Iaitu, jika pelanggan yang tiada hak akses cuba mengakses objek asal, proksi akan memintasnya dan tidak membenarkannya.

Mari lihat contoh proksi maya: Kami mempunyai beberapa antara muka pengendali:
public interface Processor {
 void process();
}
Pelaksanaan yang menggunakan terlalu banyak sumber, tetapi pada masa yang sama ia mungkin tidak digunakan setiap kali aplikasi dilancarkan:
public class HiperDifficultProcessor implements Processor {
 @Override
 public void process() {
   // некоторый сверхсложная обработка данных
 }
}
Kelas proksi:
public class HiperDifficultProcessorProxy implements Processor {
private HiperDifficultProcessor processor;

 @Override
 public void process() {
   if (processor == null) {
     processor = new HiperDifficultProcessor();
   }
   processor.process();
 }
}
Mari jalankannya dalam utama :
Processor processor = new HiperDifficultProcessorProxy();
// тут тяжеловсеного оригинального an object, ещё не сущетсвует
// но при этом есть an object, который его представляет и у которого можно вызывать его методы
processor.process(); // лишь теперь, an object оригинал был создан
Saya perhatikan bahawa banyak rangka kerja menggunakan proksi, dan untuk Spring ini adalah corak utama (Spring dijahit dengannya di dalam dan luar). Baca lebih lanjut mengenai corak ini di sini . Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 14 - 5

5. Apakah inovasi yang telah diumumkan di Java 8?

Inovasi yang dibawa oleh Java 8 adalah seperti berikut:
  • Antara muka berfungsi telah ditambah, baca tentang jenis binatang ini di sini .

  • Ungkapan Lambda, yang berkait rapat dengan antara muka berfungsi, baca lebih lanjut tentang penggunaannya di sini .

  • Menambahkan API Strim untuk memudahkan pemprosesan pengumpulan data, baca lebih lanjut di sini .

  • Menambah pautan kepada kaedah .

  • Kaedah forEach() telah ditambahkan pada antara muka Boleh Diulang .

  • Menambahkan API tarikh dan masa baharu dalam pakej java.time , analisis terperinci di sini .

  • API Serentak yang Diperbaiki .

  • Menambah kelas pembalut Pilihan , yang digunakan untuk mengendalikan nilai nol dengan betul, anda boleh menemui artikel yang sangat baik mengenai topik ini di sini .

  • Menambah keupayaan untuk antara muka menggunakan kaedah statik dan lalai (yang, pada dasarnya, membawa Java lebih dekat kepada warisan berbilang), butiran lanjut di sini .

  • Menambah kaedah baharu pada kelas Collection(removeIf(), spliterator()) .

  • Penambahbaikan kecil pada Java Core.

Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 14 - 6

6. Apakah Kesepaduan Tinggi dan Gandingan Rendah? Beri contoh.

Kohesi Tinggi atau High Cohesion ialah konsep apabila kelas tertentu mengandungi unsur-unsur yang berkait rapat antara satu sama lain dan digabungkan untuk tujuannya. Sebagai contoh, semua kaedah dalam kelas Pengguna harus mewakili tingkah laku pengguna. Kelas mempunyai kohesi yang rendah jika ia mengandungi elemen yang tidak berkaitan. Sebagai contoh, kelas Pengguna yang mengandungi kaedah pengesahan alamat e-mel:
public class User {
private String name;
private String email;

 public String getName() {
   return this.name;
 }

 public void setName(final String name) {
   this.name = name;
 }

 public String getEmail() {
   return this.email;
 }

 public void setEmail(final String email) {
   this.email = email;
 }

 public boolean isValidEmail() {
   // некоторая логика валидации емейла
 }
}
Kelas pengguna mungkin bertanggungjawab untuk menyimpan alamat e-mel pengguna, tetapi bukan untuk mengesahkannya atau menghantar e-mel. Oleh itu, untuk mencapai koheren yang tinggi, kami memindahkan kaedah pengesahan ke dalam kelas utiliti yang berasingan:
public class EmailUtil {
 public static boolean isValidEmail(String email) {
   // некоторая логика валидации емейла
 }
}
Dan kami menggunakannya mengikut keperluan (contohnya, sebelum menyimpan pengguna). Low Coupling atau Low Coupling ialah konsep yang menggambarkan saling kebergantungan rendah antara modul perisian. Pada asasnya, saling bergantung ialah bagaimana mengubah satu memerlukan perubahan yang lain. Dua kelas mempunyai gandingan yang kuat (atau gandingan ketat) jika ia berkait rapat. Sebagai contoh, dua kelas konkrit yang menyimpan rujukan antara satu sama lain dan memanggil kaedah masing-masing. Kelas yang berganding longgar lebih mudah dibangunkan dan diselenggara. Oleh kerana mereka bebas antara satu sama lain, mereka boleh dibangunkan dan diuji secara selari. Selain itu, mereka boleh diubah dan dikemas kini tanpa menjejaskan satu sama lain. Mari kita lihat contoh kelas berganding kuat. Kami mempunyai beberapa kelas pelajar:
public class Student {
 private Long id;
 private String name;
 private List<Lesson> lesson;
}
Yang mengandungi senarai pelajaran:
public class Lesson {
 private Long id;
 private String name;
 private List<Student> students;
}
Setiap pelajaran mengandungi pautan kepada pelajar yang hadir. Cengkaman yang sangat kuat, bukan? Bagaimana anda boleh mengurangkannya? Mula-mula, mari pastikan pelajar tidak mempunyai senarai mata pelajaran, tetapi senarai pengecam mereka:
public class Student {
 private Long id;
 private String name;
 private List<Long> lessonIds;
}
Kedua, kelas pelajaran tidak perlu mengetahui tentang semua pelajar, jadi mari kita padamkan senarai mereka sama sekali:
public class Lesson {
 private Long id;
 private String name;
}
Jadi ia menjadi lebih mudah, dan sambungan menjadi lebih lemah, bukankah anda fikir? Analisis soalan dan jawapan daripada temu bual untuk pembangun Java.  Bahagian 14 - 7

OOP

7. Bagaimanakah anda boleh melaksanakan pelbagai warisan di Jawa?

Warisan berbilang ialah ciri konsep berorientasikan objek di mana kelas boleh mewarisi sifat daripada lebih daripada satu kelas induk. Masalah timbul apabila terdapat kaedah dengan tandatangan yang sama dalam kedua-dua kelas super dan subkelas. Apabila memanggil kaedah, pengkompil tidak dapat menentukan kaedah kelas yang harus dipanggil, dan walaupun semasa memanggil kaedah kelas yang diutamakan. Oleh itu, Java tidak menyokong pelbagai warisan! Tetapi ada semacam kelemahan, yang akan kita bincangkan seterusnya. Seperti yang saya nyatakan sebelum ini, dengan keluaran Java 8, keupayaan untuk mempunyai kaedah lalai telah ditambahkan pada antara muka . Jika kelas yang melaksanakan antara muka tidak mengatasi kaedah ini, maka pelaksanaan lalai ini akan digunakan (ia tidak perlu untuk mengatasi kaedah lalai, seperti melaksanakan yang abstrak). Dalam kes ini, adalah mungkin untuk melaksanakan antara muka yang berbeza dalam satu kelas dan menggunakan kaedah lalainya. Mari kita lihat contoh. Kami mempunyai beberapa antara muka risalah, dengan kaedah fly() lalai :
public interface Flyer {
 default void fly() {
   System.out.println("Я лечу!!!");
 }
}
Antara muka walker, dengan kaedah walk() lalai :
public interface Walker {
 default void walk() {
   System.out.println("Я хожу!!!");
 }
}
Antara muka perenang, dengan kaedah swim() :
public interface Swimmer {
 default void swim() {
   System.out.println("Я плыву!!!");
 }
}
Nah, sekarang mari kita laksanakan semua ini dalam satu kelas itik:
public class Duck implements Flyer, Swimmer, Walker {
}
Dan mari kita jalankan semua kaedah itik kita:
Duck donald = new Duck();
donald.walk();
donald.fly();
donald.swim();
Dalam konsol kami akan menerima:
Saya pergi!!! Saya terbang!!! saya berenang!!!
Ini bermakna bahawa kami telah menggambarkan berbilang warisan dengan betul, walaupun ini bukan perkara itu. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 14 - 8Saya juga ambil perhatian bahawa jika kelas melaksanakan antara muka dengan kaedah lalai yang mempunyai nama kaedah yang sama dan hujah yang sama dalam kaedah ini, maka pengkompil akan mula mengadu tentang ketidakserasian, kerana ia tidak memahami kaedah yang benar-benar perlu digunakan. Terdapat beberapa jalan keluar:
  • Namakan semula kaedah dalam antara muka supaya ia berbeza antara satu sama lain.
  • Gantikan kaedah kontroversi tersebut dalam kelas pelaksanaan.
  • Warisi daripada kelas yang melaksanakan kaedah kontroversi ini (kemudian kelas anda akan menggunakan pelaksanaannya dengan tepat).

8. Apakah perbezaan antara kaedah final, finally dan finalize()?

akhir ialah kata kunci yang digunakan untuk meletakkan kekangan pada kelas, kaedah atau pembolehubah, kekangan yang bermaksud:
  • Untuk pembolehubah - selepas permulaan permulaan, pembolehubah tidak boleh ditakrifkan semula.
  • Untuk kaedah, kaedah tidak boleh ditindih dalam subkelas (kelas pengganti).
  • Untuk kelas - kelas tidak boleh diwarisi.
akhirnya ialah kata kunci sebelum blok kod, digunakan semasa mengendalikan pengecualian, bersama-sama dengan try block , dan bersama-sama (atau secara bergantian) dengan blok tangkapan. Kod dalam blok ini dilaksanakan dalam apa jua keadaan, tidak kira sama ada pengecualian dilemparkan atau tidak. Dalam bahagian artikel ini , dalam soalan 104, situasi luar biasa di mana blok ini tidak akan dilaksanakan dibincangkan. finalize() ialah kaedah Object class , dipanggil sebelum setiap objek dipadamkan oleh pengumpul sampah, kaedah ini akan dipanggil (terakhir), dan digunakan untuk membersihkan sumber yang diduduki. Untuk mendapatkan maklumat lanjut tentang kaedah kelas Objek yang diwarisi oleh setiap objek, lihat soalan 11 dalam bahagian artikel ini . Nah, di situlah kita akan berakhir hari ini. Jumpa anda di bahagian seterusnya! Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 14 - 9
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION