JavaRush /Java Blog /Random-ID /50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas. Ba...

50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas. Bagian 1

Dipublikasikan di grup Random-ID
Halo semuanya, hadirin sekalian, Insinyur Perangkat Lunak! Mari kita bicara tentang pertanyaan wawancara. Tentang apa yang perlu Anda persiapkan dan apa yang perlu Anda ketahui. Ini adalah alasan yang bagus untuk mengulangi atau mempelajari poin-poin ini dari awal. 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 1 - 1Saya memiliki kumpulan pertanyaan umum yang cukup banyak tentang OOP, Sintaks Java, pengecualian di Java, koleksi dan multithreading, yang untuk memudahkan saya akan membaginya menjadi beberapa bagian. Penting:kita hanya akan berbicara tentang versi Java hingga 8. Semua inovasi dari 9, 10, 11, 12, 13 tidak akan diperhitungkan di sini. Setiap ide/komentar tentang cara meningkatkan jawaban dipersilakan . Selamat membaca, ayo berangkat!

Wawancara Java: pertanyaan OOP

1. Fitur apa saja yang dimiliki Java?

Menjawab:
  1. Konsep OOP:

    1. orientasi objek;
    2. warisan;
    3. enkapsulasi;
    4. polimorfisme;
    5. abstraksi.
  2. Lintas platform: Program Java dapat dijalankan di platform apa pun tanpa modifikasi apa pun. Satu-satunya yang Anda perlukan adalah JVM (mesin virtual java) yang terinstal.

  3. Kinerja tinggi: JIT (kompiler Just In Time) memungkinkan kinerja tinggi. JIT mengubah bytecode menjadi kode mesin dan kemudian JVM memulai eksekusi.

  4. Multithreading: Thread eksekusi yang dikenal sebagai Thread. JVM membuat thread bernama main thread. Seorang programmer dapat membuat banyak thread dengan mewarisi dari kelas Thread atau dengan mengimplementasikan antarmuka Runnable.

2. Apa yang dimaksud dengan warisan?

Pewarisan artinya suatu kelas dapat mewarisi (“ meluas ”) kelas lainnya. Dengan cara ini Anda dapat menggunakan kembali kode dari kelas yang Anda warisi. Kelas yang sudah ada disebut superclass, dan kelas yang sedang dibuat disebut subclass. Mereka juga mengatakan parentdan child.
public class Animal {
   private int age;
}

public class Dog extends Animal {

}
dimana Animal, parentdan Dog- child.

3. Apa itu enkapsulasi?

Pertanyaan ini sering muncul saat wawancara pengembang Java. Enkapsulasi menyembunyikan implementasi menggunakan pengubah akses, menggunakan pengambil dan penyetel. Hal ini dilakukan untuk menutup akses penggunaan eksternal di tempat-tempat yang dianggap perlu oleh pengembang. Contoh nyata dari kehidupan adalah mobil. Kami tidak memiliki akses langsung ke pengoperasian mesin. Bagi kami, tugasnya adalah memasukkan kunci kontak dan menghidupkan mesin. Dan proses apa yang akan terjadi bukanlah urusan kami. Terlebih lagi, campur tangan kita dalam aktivitas ini dapat menimbulkan situasi yang tidak terduga, sehingga kita dapat merusak mobil dan merugikan diri kita sendiri. Hal yang persis sama terjadi dalam pemrograman. Dijelaskan dengan baik di Wikipedia . Ada juga artikel tentang enkapsulasi di JavaRush .

4. Apa itu polimorfisme?

Polimorfisme adalah kemampuan suatu program untuk menggunakan objek dengan antarmuka yang sama secara identik tanpa informasi tentang tipe spesifik objek tersebut. Seperti yang mereka katakan, satu antarmuka - banyak implementasi. Dengan polimorfisme, Anda dapat menggabungkan dan menggunakan berbagai jenis objek berdasarkan perilaku umumnya. Misalnya, kita memiliki kelas Hewan, yang memiliki dua keturunan - Anjing dan Kucing. Kelas Hewan generik memiliki perilaku yang sama untuk semua - mengeluarkan suara. Jika kita perlu mengumpulkan semua turunan dari kelas Animal dan menjalankan metode “membuat suara”, kita menggunakan kemungkinan polimorfisme. Ini akan terlihat seperti ini:
List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
Jadi polimorfisme membantu kita. Selain itu, hal ini juga berlaku untuk metode polimorfik (kelebihan beban). Praktek menggunakan polimorfisme

Pertanyaan Wawancara - Sintaks Java

5. Apa yang dimaksud dengan konstruktor di Java?

Karakteristik berikut ini valid:
  1. Ketika objek baru dibuat, program menggunakan konstruktor yang sesuai untuk melakukannya.
  2. Konstruktor itu seperti sebuah metode. Keunikannya adalah tidak ada elemen yang kembali (termasuk void), dan namanya sama dengan nama kelasnya.
  3. Jika tidak ada konstruktor yang ditulis secara eksplisit, maka konstruktor kosong akan dibuat secara otomatis.
  4. Konstruktor dapat diganti.
  5. Jika konstruktor dengan parameter telah dibuat, tetapi Anda juga memerlukannya tanpa parameter, Anda perlu menulisnya secara terpisah, karena tidak dibuat secara otomatis.

6. Dua kelas manakah yang tidak mewarisi Object?

Jangan tertipu oleh provokasi, tidak ada kelas seperti itu: semua kelas secara langsung atau melalui nenek moyang diwarisi dari kelas Object!

7. Apa yang dimaksud dengan Variabel Lokal?

Pertanyaan populer lainnya selama wawancara pengembang Java. Variabel lokal adalah variabel yang didefinisikan di dalam suatu metode dan ada hingga saat metode tersebut dijalankan. Setelah eksekusi berakhir, variabel lokal tidak akan ada lagi. Berikut adalah program yang menggunakan variabel lokal helloMessage dalam metode main():
public static void main(String[] args) {
   String helloMessage;
   helloMessage = "Hello, World!";
   System.out.println(helloMessage);
}

8. Apa yang dimaksud dengan Variabel Instance?

Variabel Instance adalah variabel yang didefinisikan di dalam kelas, dan variabel tersebut ada hingga saat objek tersebut ada. Contohnya adalah kelas Bee, yang memiliki dua variabel nectarCapacity dan maxNectarCapacity:
public class Bee {

   /**
    * Current nectar capacity
    */
   private double nectarCapacity;

   /**
    * Maximal nectar that can take bee.
    */
   private double maxNectarCapacity = 20.0;

  ...
}

9. Apa yang dimaksud dengan pengubah akses?

Pengubah akses adalah alat yang memungkinkan Anda menyesuaikan akses ke kelas, metode, dan variabel. Ada pengubah berikut, diurutkan berdasarkan peningkatan akses:
  1. private- digunakan untuk metode, bidang, dan konstruktor. Tingkat akses hanyalah kelas di mana ia dideklarasikan.
  2. package-private(default)- Dapat digunakan untuk kelas. Akses hanya dalam paket tertentu di mana kelas, metode, variabel, konstruktor dideklarasikan.
  3. protected— akses yang sama seperti package-private+ untuk kelas-kelas yang mewarisi kelas dengan pengubah protected.
  4. public- juga digunakan untuk kelas. Akses penuh di seluruh aplikasi.
  5. 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 1 - 2

10. Apa yang dimaksud dengan metode utama?

Penggantian metode terjadi ketika anak ingin mengubah perilaku kelas induk. Jika Anda ingin apa yang ada dalam metode induk dieksekusi, Anda dapat menggunakan konstruksi seperti super.methodName() pada anak, yang akan melakukan pekerjaan metode induk, dan baru kemudian menambahkan logika. Persyaratan yang harus dipenuhi:
  • tanda tangan metode harus sama;
  • nilai kembaliannya harus sama.

11. Apa yang dimaksud dengan tanda tangan metode?

50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 1 - 3Tanda tangan metode adalah sekumpulan nama metode dan argumen yang diterima metode tersebut. Tanda tangan metode adalah pengidentifikasi unik untuk suatu metode saat melakukan kelebihan beban pada metode.

12. Apa yang dimaksud dengan metode kelebihan beban?

Kelebihan metode adalah properti polimorfisme di mana dengan mengubah tanda tangan metode, Anda dapat membuat metode berbeda untuk tindakan yang sama:
  • nama metode yang sama;
  • argumen yang berbeda;
  • mungkin ada tipe pengembalian yang berbeda.
Misalnya, hal yang sama add()dapat ArrayListdi-overload sebagai berikut dan akan melakukan penambahan dengan cara yang berbeda, bergantung pada argumen yang masuk:
  • add(Object o)- cukup menambahkan objek;
  • add(int index, Object o)— menambahkan objek ke indeks tertentu;
  • add(Collection<Object> c)— menambahkan daftar objek;
  • add(int index, Collection<Object> c)— menambahkan daftar objek, dimulai dari indeks tertentu.

13. Apa itu Antarmuka?

Warisan berganda tidak diterapkan di Java, jadi untuk mengatasi masalah ini, antarmuka seperti yang kita kenal ditambahkan ;) Untuk waktu yang lama, antarmuka hanya memiliki metode tanpa mengimplementasikannya. Sebagai bagian dari jawaban ini, kita akan membicarakannya. Misalnya:

public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
Beberapa nuansa mengikuti dari ini:
  • semua metode di antarmuka bersifat publik dan abstrak;
  • semua variabel adalah public static final;
  • kelas tidak mewarisinya (meluas), tetapi mengimplementasikannya (mengimplementasikan). Selain itu, Anda dapat mengimplementasikan antarmuka sebanyak yang Anda suka.
  • kelas yang mengimplementasikan antarmuka harus menyediakan implementasi semua metode yang dimiliki antarmuka.
Seperti ini:
public class Cat implements Animal {
   public void makeSound() {
       // method implementation
   }

   public void eat() {
       // implementation
   }

   public void sleep() {
       // implementation
   }
}

14. Apa metode default di Antarmuka?

Sekarang mari kita bicara tentang metode default. Untuk apa, untuk siapa? Metode-metode ini ditambahkan untuk menjadikan segalanya “milik Anda dan milik kami”. Apa yang saya bicarakan? Ya, di satu sisi, perlu menambahkan fungsionalitas baru: lambda, Stream API, di sisi lain, perlu meninggalkan apa yang terkenal dengan Java - kompatibilitas ke belakang. Untuk melakukan ini, perlu untuk memperkenalkan solusi siap pakai ke dalam antarmuka. Ini adalah bagaimana metode default datang kepada kami. Artinya, metode default adalah metode yang diimplementasikan pada antarmuka yang memiliki kata kunci default. Misalnya, metode yang terkenal stream()di Collection. Coba lihat, antarmuka ini tidak sesederhana kelihatannya ;). Atau juga cara yang sama terkenalnya forEach()dari Iterable. Itu juga tidak ada sampai metode default ditambahkan. Omong-omong, Anda juga dapat membaca tentang ini di JavaRush .

15. Lalu bagaimana cara mewarisi dua metode default yang identik?

Berdasarkan jawaban sebelumnya tentang apa metode defaultnya, Anda dapat mengajukan pertanyaan lain. Jika Anda dapat mengimplementasikan metode dalam antarmuka, maka secara teori Anda dapat mengimplementasikan dua antarmuka dengan metode yang sama, dan bagaimana cara melakukannya? Ada dua antarmuka berbeda dengan metode yang sama:
interface A {
   default void foo() {
       System.out.println("Foo A");
   }
}

interface B {
   default void foo() {
       System.out.println("Foo B");
   }
}
Dan ada kelas yang mengimplementasikan kedua antarmuka ini. Untuk menghindari ketidakpastian dan untuk mengkompilasi kode, kita perlu mengganti metode foo()di kelas C, dan kita cukup memanggil metode foo()dari salah satu antarmuka di dalamnya - Aatau B. Tapi bagaimana cara memilih metode antarmuka tertentu Аatau В? Ada struktur seperti ini untuk ini A.super.foo():
public class C implements A, B {
   @Override
   public void foo() {
       A.super.foo();
   }
}
atau:
public class C implements A, B {
   @Override
   public void foo() {
       B.super.foo();
   }
}
Jadi, metode foo()kelas Cakan menggunakan metode default foo()dari antarmuka Aatau metode foo()dari antarmukaB .

16. Apa yang dimaksud dengan metode dan kelas abstrak?

Java memiliki kata khusus abstractyang digunakan untuk menunjukkan kelas dan metode abstrak. Pertama, beberapa definisi. Metode abstrak adalah metode yang dibuat tanpa implementasi dengan kata kunci abstractdi kelas abstrak. Artinya, ini adalah metode seperti di antarmuka, hanya dengan penambahan kata kunci, misalnya:
public abstract void foo();
Kelas abstrak adalah kelas yang juga memiliki abstractkata:
public abstract class A {

}
Kelas abstrak memiliki beberapa fitur:
  • suatu objek tidak dapat dibuat atas dasar itu;
  • ia dapat memiliki metode abstrak;
  • itu mungkin tidak memiliki metode abstrak.
Kelas abstrak diperlukan untuk menggeneralisasi beberapa jenis abstraksi (maaf atas tautologinya), yang tidak ada dalam kehidupan nyata, tetapi mengandung banyak perilaku dan keadaan umum (yaitu metode dan variabel). Ada lebih dari cukup contoh dari kehidupan. Semuanya ada di sekitar kita. Bisa berupa “binatang”, “mobil”, “sosok geometris” dan seterusnya.

17. Apa perbedaan antara String, Pembuat String, dan String Buffer?

Nilai-nilai Stringdisimpan dalam kumpulan string konstan. Setelah baris dibuat, baris tersebut akan muncul di kumpulan ini. Dan tidak mungkin untuk menghapusnya. Misalnya:
String name = "book";
...variabel akan mengacu pada kumpulan string Kumpulan string konstan 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 1 - 4 Jika Anda menetapkan nama variabel ke nilai yang berbeda, Anda akan mendapatkan yang berikut:
name = "pen";
Kumpulan string konstan 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 1 - 5Jadi kedua nilai ini akan tetap ada. Penyangga Tali:
  • nilai Stringdisimpan di tumpukan. Jika nilainya diubah, maka nilai baru akan diganti dengan nilai lama;
  • String Bufferdisinkronkan dan karenanya aman untuk thread;
  • Karena keamanan benang, kecepatan pengoperasian masih jauh dari yang diinginkan.
Contoh:
StringBuffer name = "book";
50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 1 - 6Segera setelah nilai name berubah, nilai pada tumpukan berubah: 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 1 - 7StringBuilder Sama persis dengan StringBuffer, hanya saja ini tidak aman untuk thread. Oleh karena itu, kecepatannya jelas lebih tinggi daripada di StringBuffer.

18. Apa perbedaan antara kelas abstrak dan antarmuka?

Kelas abstrak:
  • kelas abstrak memiliki konstruktor default; itu dipanggil setiap kali anak dari kelas abstrak ini dibuat;
  • berisi metode abstrak dan non-abstrak. Pada umumnya, ini mungkin tidak berisi metode abstrak, tetapi tetap merupakan kelas abstrak;
  • kelas yang mewarisi dari kelas abstrak harus mengimplementasikan hanya metode abstrak;
  • kelas abstrak dapat berisi Variabel Instance (lihat pertanyaan #5).
Antarmuka:
  • tidak memiliki konstruktor dan tidak dapat diinisialisasi;
  • hanya metode abstrak yang harus ditambahkan (tidak termasuk metode default);
  • kelas yang mengimplementasikan antarmuka harus mengimplementasikan semua metode (tidak termasuk metode default);
  • antarmuka hanya dapat berisi konstanta.

19. Mengapa mengakses elemen dalam array membutuhkan O(1)?

Pertanyaan ini sebenarnya berasal dari wawancara terakhir. Seperti yang saya pelajari kemudian, pertanyaan ini diajukan untuk melihat bagaimana seseorang berpikir. Jelas bahwa pengetahuan ini tidak mempunyai arti praktis: mengetahui fakta ini saja sudah cukup. Pertama, kita perlu memperjelas bahwa O(1) adalah sebutan untuk kompleksitas waktu suatu algoritma ketika operasi berlangsung dalam waktu yang konstan. Artinya, sebutan ini merupakan eksekusi tercepat. Untuk menjawab pertanyaan ini, kita perlu memahami apa yang kita ketahui tentang array? Untuk membuat array int, kita harus menulis yang berikut ini:
int[] intArray = new int[100];
Beberapa kesimpulan dapat diambil dari rekaman ini:
  1. Saat membuat array, tipenya diketahui, jika tipenya diketahui, maka jelas berapa ukuran setiap sel array.
  2. Diketahui berapa ukuran arraynya.
Berikut ini: untuk memahami sel mana yang akan ditulis, Anda hanya perlu menghitung area memori mana yang akan ditulis. Untuk sebuah mobil, ini sangat mudah. Mesin memiliki awal memori yang dialokasikan, sejumlah elemen, dan ukuran sel tunggal. Dari sini jelas bahwa ruang perekaman akan sama dengan lokasi awal array + ukuran sel dikalikan ukurannya.

Bagaimana Anda mendapatkan O(1) dalam mengakses objek di ArrayList?

Pertanyaan ini menyusul pertanyaan sebelumnya. Memang benar ketika kita bekerja dengan sebuah array dan terdapat primitif di sana, kita mengetahui terlebih dahulu berapa ukuran tipe ini ketika dibuat. Namun bagaimana jika ada skema seperti pada gambar: 50 Pertanyaan dan Jawaban Wawancara Inti Java Teratas.  Bagian 1 - 8dan kita ingin membuat koleksi dengan elemen tipe A, dan menambahkan implementasi berbeda - B, C, D:
List<A> list = new ArrayList();
list.add(new B());
list.add(new C());
list.add(new D());
list.add(new B());
Dalam situasi ini, bagaimana Anda dapat memahami ukuran setiap sel, karena setiap objek akan berbeda dan mungkin memiliki bidang tambahan yang berbeda (atau sama sekali berbeda). Apa yang harus dilakukan? Di sini pertanyaannya diajukan sedemikian rupa sehingga membingungkan dan membingungkan. Kita tahu bahwa sebenarnya koleksi tidak menyimpan objek, tetapi hanya link ke objek tersebut. Dan semua link memiliki ukuran yang sama, dan itu diketahui. Jadi menghitung ruang di sini cara kerjanya sama seperti pada pertanyaan sebelumnya.

21. Autoboxing dan unboxing

Latar belakang sejarah: autoboxing dan autounboxing adalah salah satu inovasi utama JDK 5. Autoboxing adalah proses konversi otomatis dari tipe primitif ke kelas wrapper yang sesuai. Auto-unboxing - melakukan kebalikan dari auto-boxing - mengubah kelas wrapper menjadi primitif. Tetapi jika ada nilai pembungkus null, maka pengecualian akan dilempar saat membongkar NullPointerException.

Pencocokan primitif - pembungkus

Primitif Kelas pembungkus
boolean Boolean
ke dalam Bilangan bulat
byte byte
arang Karakter
mengambang Mengambang
panjang Panjang
pendek Pendek
dobel Dobel

Pengemasan otomatis terjadi:

  • saat menugaskan referensi primitif ke kelas wrapper:

    SEBELUM Jawa 5:

    //manual packaging or how it was BEFORE Java 5.
    public void boxingBeforeJava5() {
       Boolean booleanBox = new Boolean(true);
       Integer intBox = new Integer(3);
       // and so on to other types
    }
    
    после Java 5:
    //automatic packaging or how it became in Java 5.
    public void boxingJava5() {
       Boolean booleanBox = true;
       Integer intBox = 3;
       // and so on to other types
    }
  • ketika meneruskan primitif sebagai argumen ke metode yang mengharapkan pembungkus:

    public void exampleOfAutoboxing() {
       long age = 3;
       setAge(age);
    }
    
    public void setAge(Long age) {
       this.age = age;
    }

Pembongkaran otomatis terjadi:

  • ketika kita menetapkan variabel primitif ke kelas wrapper:

    //before Java 5:
    int intValue = new Integer(4).intValue();
    double doubleValue = new Double(2.3).doubleValue();
    char c = new Character((char) 3).charValue();
    boolean b = Boolean.TRUE.booleanValue();
    
    //and after JDK 5:
    int intValue = new Integer(4);
    double doubleValue = new Double(2.3);
    char c = new Character((char) 3);
    boolean b = Boolean.TRUE;
  • Dalam kasus dengan operasi aritmatika. Mereka hanya berlaku untuk tipe primitif; untuk ini Anda perlu melakukan unboxing pada tipe primitif.

    // Before Java 5
    Integer integerBox1 = new Integer(1);
    Integer integerBox2 = new Integer(2);
    
    // for comparison it was necessary to do this:
    integerBox1.intValue() > integerBox2.intValue()
    
    //в Java 5
    integerBox1 > integerBox2
  • ketika diteruskan ke pembungkus dalam metode yang menerima primitif yang sesuai:

    public void exampleOfAutoboxing() {
       Long age = new Long(3);
       setAge(age);
    }
    
    public void setAge(long age) {
       this.age = age;
    }

22. Apa kata kunci terakhir dan di mana menggunakannya?

Kata kunci finaldapat digunakan untuk variabel, metode dan kelas.
  1. Variabel akhir tidak dapat dipindahkan ke objek lain.
  2. kelas terakhir mandul)) tidak dapat mempunyai ahli waris.
  3. metode final tidak dapat ditimpa pada leluhur.
Bagian atas sudah kita bahas, sekarang mari kita bahas lebih detail.

variabel akhir

;Java memberi kita dua cara untuk membuat variabel dan memberikan beberapa nilai padanya:
  1. Anda dapat mendeklarasikan variabel dan menginisialisasinya nanti.
  2. Anda dapat mendeklarasikan variabel dan segera menetapkannya.
Contoh penggunaan variabel final untuk kasus ini:
public class FinalExample {

   //final static variable, which is immediately initialized:
   final static String FINAL_EXAMPLE_NAME = "I'm likely final one";

   //final is a variable that is not initialized, but will only work if
   //initialize this in the constructor:
   final long creationTime;

   public FinalExample() {
       this.creationTime = System.currentTimeMillis();
   }

   public static void main(String[] args) {
       FinalExample finalExample = new FinalExample();
       System.out.println(finalExample.creationTime);

       // final field FinalExample.FINAL_EXAMPLE_NAME cannot be assigned
//    FinalExample.FINAL_EXAMPLE_NAME = "Not you're not!";

       // final field Config.creationTime cannot be assigned
//    finalExample.creationTime = 1L;
   }
}

Bisakah variabel Final dianggap sebagai konstanta?

Karena kita tidak dapat memberikan nilai baru pada variabel akhir, nampaknya ini adalah variabel konstan. Tapi ini hanya sekilas. Jika tipe data yang dirujuk oleh variabel adalah immutable, maka ya, itu adalah sebuah konstanta. Tetapi jika tipe datanya mutablebisa berubah, maka dengan menggunakan metode dan variabel akan dimungkinkan untuk mengubah nilai objek yang finaldirujuk oleh variabel tersebut, dan dalam hal ini tidak bisa disebut konstanta. Jadi, contoh tersebut menunjukkan bahwa beberapa variabel akhir benar-benar konstan, namun ada pula yang tidak, dan dapat diubah.
public class FinalExample {

   //immutable final variables:
   final static String FINAL_EXAMPLE_NAME = "I'm likely final one";
   final static Integer FINAL_EXAMPLE_COUNT  = 10;

   // mutable filter variables
   final List<String> addresses = new ArrayList();
   final StringBuilder finalStringBuilder = new StringBuilder("constant?");
}

Variabel akhir lokal

Ketika finalsebuah variabel dibuat di dalam suatu metode, itu disebut local finalvariabel:
public class FinalExample {

   public static void main(String[] args) {
       // This is how you can
       final int minAgeForDriveCar = 18;

       // or you can do it this way, in the foreach loop:
       for (final String arg : args) {
           System.out.println(arg);
       }
   }

}
Kita dapat menggunakan kata kunci finaldalam perulangan yang diperluas forkarena setelah menyelesaikan perulangan, forvariabel baru dibuat setiap kali. Tapi ini tidak berlaku untuk loop for normal, jadi kode di bawah ini akan memunculkan kesalahan waktu kompilasi.
// final local changed j cannot be assigned
for (final int i = 0; i < args.length; i ++) {
   System.out.println(args[i]);
}

Kelas terakhir

Anda tidak dapat memperluas kelas yang dideklarasikan sebagai final. Sederhananya, tidak ada kelas yang dapat mewarisi kelas ini. Contoh finalkelas yang bagus di JDK adalah String. Langkah pertama untuk membuat kelas yang tidak dapat diubah adalah menandainya sebagai final, sehingga tidak dapat diperluas:
public final class FinalExample {
}

// Compilation error here
class WantsToInheritFinalClass extends FinalExample {
}

Metode terakhir

Ketika suatu metode ditandai final, maka disebut metode final (logis, bukan?). Metode Final tidak dapat ditimpa di kelas turunan. Ngomong-ngomong, metode di kelas Object - wait() dan notify() - bersifat final, jadi kita tidak punya kesempatan untuk menimpanya.
public class FinalExample {
   public final String generateAddress() {
       return "Some address";
   }
}

class ChildOfFinalExample extends FinalExample {

   // compile error here
   @Override
   public String generateAddress() {
       return "My OWN Address";
   }
}

Bagaimana dan di mana menggunakan final di Java

  • gunakan kata kunci final untuk mendefinisikan beberapa konstanta tingkat kelas;
  • buat variabel akhir untuk objek jika Anda tidak ingin objek tersebut diubah. Misalnya, properti spesifik objek yang dapat kita gunakan untuk tujuan logging;
  • jika Anda tidak ingin kelas diperpanjang, tandai sebagai final;
  • jika Anda perlu membuat kelas< yang tidak dapat diubah, Anda harus menjadikannya final;
  • jika Anda ingin implementasi suatu metode tidak berubah pada turunannya, tetapkan metode tersebut sebagai final. Hal ini sangat penting untuk memastikan implementasinya tidak berubah.

23. Apa yang dimaksud dengan kekekalan yang bisa diubah?

Yg mungkin berubah

Mutable adalah objek yang status dan variabelnya dapat diubah setelah pembuatan. Misalnya kelas seperti StringBuilder, StringBuffer. Contoh:
public class MutableExample {

   private String address;

   public MutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // this setter can change the name field
   public void setAddress(String address) {
       this.address = address;
   }

   public static void main(String[] args) {

       MutableExample obj = new MutableExample("first address");
       System.out.println(obj.getAddress());

       // update the name field, so this is a mutable object
       obj.setAddress("Updated address");
       System.out.println(obj.getAddress());
   }
}

Kekal

Immutable adalah objek yang status dan variabelnya tidak dapat diubah setelah objek dibuat. Mengapa bukan kunci yang bagus untuk HashMap, bukan?) Misalnya, String, Integer, Double, dan seterusnya. Contoh:
// make this class final so no one can change it
public final class ImmutableExample {

   private String address;

   ImmutableExample (String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   //remove the setter

   public static void main(String[] args) {

       ImmutableExample obj = new ImmutableExample("old address");
       System.out.println(obj.getAddress());

       // Therefore, do not change this field in any way, so this is an immutable object
       // obj.setName("new address");
       // System.out.println(obj.getName());

   }
}

24. Bagaimana cara menulis kelas yang tidak dapat diubah?

Setelah Anda mengetahui apa itu objek yang bisa berubah dan tidak bisa diubah, pertanyaan selanjutnya adalah wajar - bagaimana cara menulisnya? Untuk menulis kelas yang tidak dapat diubah, Anda perlu mengikuti langkah-langkah sederhana:
  • membuat kelas menjadi final.
  • jadikan semua bidang pribadi dan buat hanya pengambil untuk bidang tersebut. Setter, tentu saja, tidak diperlukan.
  • Jadikan semua bidang yang bisa diubah bersifat final sehingga nilainya hanya dapat ditetapkan satu kali.
  • menginisialisasi semua bidang melalui konstruktor, melakukan penyalinan mendalam (yaitu, menyalin objek itu sendiri, variabelnya, variabel variabel, dan sebagainya)
  • mengkloning objek variabel yang bisa berubah di getter untuk mengembalikan hanya salinan nilai dan bukan referensi ke objek sebenarnya.
Contoh:
/**
* An example of creating an immutable object.
*/
public final class FinalClassExample {

   private final int age;

   private final String name;

   private final HashMap<String, String> addresses;

   public int getAge() {
       return age;
   }


   public String getName() {
       return name;
   }

   /**
    * Clone the object before returning it.
    */
   public HashMap<String, String> getAddresses() {
       return (HashMap<String, String>) addresses.clone();
   }

   /**
    * In the constructor, deep copy the mutable objects.
    */
   public FinalClassExample(int age, String name, HashMap<String, String> addresses) {
       System.out.println("Performing a deep copy in the constructor");
       this.age = age;
       this.name = name;
       HashMap<String, String> temporaryMap = new HashMap<>();
       String key;
       Iterator<String> iterator = addresses.keySet().iterator();
       while (iterator.hasNext()) {
           key = iterator.next();
           temporaryMap.put(key, addresses.get(key));
       }
       this.addresses = temporaryMap;
   }
}
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION