CodeGym /Java Blog /Acak /50 pertanyaan dan jawaban wawancara kerja teratas untuk J...
John Squirrels
Level 41
San Francisco

50 pertanyaan dan jawaban wawancara kerja teratas untuk Java Core. Bagian 1

Dipublikasikan di grup Acak
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 waktu yang tepat untuk meninjau atau mempelajari poin-poin ini untuk pertama kalinya. 50 pertanyaan dan jawaban wawancara kerja teratas untuk Java Core.  Bagian 1 - 1 Saya berakhir dengan kumpulan pertanyaan yang sering diajukan tentang OOP, sintaks Java, pengecualian Java, koleksi, dan multithreading, yang akan saya bagi menjadi beberapa bagian untuk kenyamanan. Sulit untuk membahas semuanya sekaligus, tetapi saya harap materi ini akan memberikan dasar yang baik bagi mereka yang bersiap untuk mencari pekerjaan pertama mereka sebagai seorang programmer. Untuk pemahaman dan retensi terbaik, saya menyarankan untuk menyisir sumber lain juga. Anda bisa mendapatkan pemahaman yang lebih dalam tentang suatu konsep dengan mendekatinya dari beberapa sudut yang berbeda. Penting:Kami hanya akan berbicara tentang Java sebelum versi 8. Semua inovasi yang hadir di versi 9, 10, 11, 12, dan 13 tidak akan dibahas di sini. Setiap ide/komentar tentang cara meningkatkan jawaban dipersilakan . Selamat membaca. Ayo pergi!

Wawancara Java: pertanyaan tentang OOP

1. Apa ciri-ciri bahasa Jawa?

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 perubahan apa pun. Tentu saja, ini membutuhkan JVM (Java virtual machine) yang terinstal.

  3. Performa tinggi: Kompiler Just-In-Time (JIT) memungkinkan performa tinggi. Kompiler JIT mengubah bytecode menjadi kode mesin dan kemudian JVM memulai eksekusi.

  4. Multithreading: JVM membuat utas eksekusi yang disebut main thread. Seorang programmer dapat membuat banyak utas dengan menurunkan dari kelas Thread atau mengimplementasikan antarmuka Runnable.

2. Apa itu warisan?

Warisan berarti bahwa satu kelas dapat mewarisi kelas lain (menggunakan kata kunci extends ). Ini berarti Anda dapat menggunakan kembali kode dari kelas yang Anda warisi. Kelas yang ada dikenal sebagai the superclassdan kelas yang baru dibuat adalah the subclass. Orang juga mengatakan menggunakan istilah parent dan child.

public class Animal {
   private int age;
}

public class Dog extends Animal {

}
dimana dan adalah . Animal_parentDogchild

3. Apa itu enkapsulasi?

Pertanyaan ini sering ditanyakan dalam wawancara untuk posisi pengembang Java. Enkapsulasi menyembunyikan implementasi dengan menggunakan pengubah akses, getter, dan setter. Ini dilakukan untuk mencegah akses eksternal di mana pun pengembang menganggapnya perlu. Contoh sederhana dari kehidupan nyata adalah mobil. Kami tidak memiliki akses langsung ke pengoperasian mesin. Yang perlu kita lakukan hanyalah memasukkan kunci ke dalam kunci kontak dan menyalakan mesin. Proses yang terjadi di bawah tenda bukanlah urusan kami. Selain itu, jika kita mengganggu aktivitas mesin, hal itu dapat menyebabkan situasi yang tidak terduga, dapat merusak mobil dan mengakibatkan cedera tubuh. Hal yang persis sama terjadi dalam pemrograman. Ini dijelaskan dengan baik di Wikipedia. Ada juga artikel tentang enkapsulasi di CodeGym .

4. Apa itu polimorfisme?

Polimorfisme adalah kemampuan program untuk memperlakukan objek dengan antarmuka yang sama dengan cara yang sama, tanpa informasi tentang jenis spesifik objek tersebut. Seperti kata pepatah, "satu antarmuka — banyak implementasi". Dengan polimorfisme, Anda dapat menggabungkan dan menggunakan berbagai jenis objek berdasarkan perilaku bersama. Misalnya, kita memiliki kelas Hewan yang memiliki dua keturunan: Anjing dan Kucing. Kelas Animal generik memiliki perilaku yang dimiliki oleh semua orang, kemampuan untuk mengeluarkan suara. Kami menggunakan kemampuan polimorfik saat kami perlu mengumpulkan semua yang mewarisi kelas Hewan dan menjalankan metode "buat suara". Begini tampilannya:

List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
Dengan kata lain, polimorfisme sangat membantu. Dan ini juga berlaku untuk metode polimorfik (kelebihan beban). Cara menggunakan polimorfisme

Wawancara pertanyaan tentang sintaks Java

5. Apa itu konstruktor di Jawa?

Konstruktor memiliki ciri-ciri sebagai berikut:
  1. Saat objek baru dibuat, program menggunakan konstruktor yang sesuai untuk membuatnya.
  2. Konstruktor seperti metode. Ciri khasnya terletak pada tidak adanya nilai kembalian (termasuk void) dan namanya sama dengan nama kelasnya.
  3. Jika tidak ada konstruktor yang dibuat secara eksplisit, konstruktor kosong dibuat secara otomatis.
  4. Konstruktor dapat diganti.
  5. Jika Anda mendeklarasikan konstruktor dengan parameter tetapi juga memerlukan konstruktor tanpa parameter, maka Anda harus membuatnya secara terpisah, karena konstruktor tidak akan dibuat secara otomatis.

6. Dua class manakah yang tidak mewarisi Object?

Jangan tertipu oleh pertanyaan jebakan — tidak ada kelas seperti itu. Semua kelas mewarisi kelas Objek baik secara langsung maupun melalui leluhur!

7. Apa itu variabel lokal?

Ini adalah pertanyaan wawancara populer lainnya untuk pengembang Java. Variabel lokal adalah variabel yang didefinisikan di dalam metode dan ada selama metode tersebut dieksekusi. Segera setelah eksekusi berakhir, variabel lokal tidak ada lagi. Berikut adalah program yang menggunakan variabel lokal bernama 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 instan?

Variabel instan adalah variabel yang dideklarasikan di dalam kelas. Itu ada selama objek ada. Misalnya, kami memiliki kelas Bee, yang memiliki dua variabel instan — nektarLoad dan maxNectarLoad:

public class Bee {

   /**
    * Current nectar load
    */
   private double nectarLoad;

   /**
    * Maximum nectar that can the bee can collect.
    */
   private double maxNectarLoad = 20.0;
 
  ...
}

9. Apa itu pengubah akses?

Pengubah akses adalah mekanisme untuk menyesuaikan akses ke kelas, metode, dan variabel. Pengubah berikut ada, tercantum dalam urutan peningkatan akses:
  1. private— Pengubah akses ini digunakan pada metode, bidang, dan konstruktor. Akses terbatas pada kelas tempat mereka dideklarasikan.
  2. package-private (default)— Ini adalah tingkat akses default untuk kelas. Akses terbatas pada paket tertentu di mana kelas, metode, variabel, atau konstruktor dideklarasikan.
  3. protected— Pengubah akses ini menawarkan tingkat akses yang sama dengan package-privatepenambahan akses untuk kelas yang mewarisi kelas dengan protectedpengubah.
  4. public— Tingkat akses ini juga digunakan untuk kelas. Tingkat akses ini berarti ada akses penuh di seluruh aplikasi.
50 pertanyaan dan jawaban wawancara kerja teratas untuk Java Core.  Bagian 1 - 2

10. Apa yang dimaksud dengan metode overriding?

Kami mengganti metode ketika kelas anak ingin mengubah perilaku kelas induknya. Jika kita juga perlu melakukan apa yang ada di metode induk, kita bisa menggunakan super.methodName() di anak, yang akan menjalankan metode induk. Kami dapat menambahkan logika tambahan kami setelah itu. Persyaratan yang harus diperhatikan:
  • tanda tangan metode harus sama
  • nilai pengembalian harus sama

11. Apa itu tanda tangan metode?

50 pertanyaan dan jawaban wawancara kerja teratas untuk Java Core.  Bagian 1 - 3Tanda tangan metode adalah kombinasi dari nama metode dan argumen yang diambil metode tersebut. Tanda tangan metode adalah pengidentifikasi unik metode saat membebani metode.

12. Apa itu metode overloading?

Kelebihan metode adalah fitur polimorfisme di mana kami mengubah tanda tangan metode untuk membuat beberapa metode yang melakukan tindakan yang sama:
  • nama yang sama
  • argumen yang berbeda
  • mungkin ada berbagai jenis pengembalian
Misalnya, metode ArrayListkelas add()bisa kelebihan muatan, memungkinkan kita untuk menambahkan dengan cara yang berbeda bergantung pada argumen masukan:
  • add(Object o)— Metode ini hanya menambahkan objek
  • add(int index, Object o)— Metode ini menambahkan objek pada indeks tertentu
  • add(Collection<Object> c)— Metode ini menambahkan daftar objek
  • add(int index, Collection<Object> c)— Metode ini menambahkan daftar objek mulai dari indeks tertentu.

13. Apa itu antarmuka?

Java tidak mendukung banyak pewarisan. Untuk mengatasi batasan ini, antarmuka ditambahkan ke dalam bentuk yang kita kenal dan sukai ;) Untuk waktu yang lama, antarmuka hanya memiliki metode tanpa implementasi apa pun. Dalam konteks jawaban ini, mari kita bicarakan tentang mereka. Misalnya:


public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
Beberapa detail mengikuti dari ini:
  • Semua metode dalam antarmuka bersifat publik dan abstrak
  • Semua variabel adalah final statis publik
  • Kelas tidak mewarisi antarmuka (yaitu kita tidak menggunakan kata kunci extends). Sebaliknya, kelas mengimplementasikannya (yaitu kita menggunakan kata kunci implements). Selain itu, Anda dapat mengimplementasikan antarmuka sebanyak yang Anda inginkan.
  • Kelas yang mengimplementasikan sebuah antarmuka harus menyediakan implementasi dari semua metode yang ada di 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 dalam sebuah antarmuka?

Sekarang mari kita bicara tentang metode default. Untuk apa mereka? Untuk siapa mereka? Metode ini ditambahkan untuk melayani "kedua tangan". Apa yang saya bicarakan? Nah, di satu sisi, ada kebutuhan untuk menambahkan fungsionalitas baru: lambdas dan Stream API. Di sisi lain, perlu untuk mempertahankan apa yang terkenal dengan Java - kompatibilitas mundur. Untuk melakukan ini, antarmuka memerlukan beberapa solusi baru yang sudah jadi. Beginilah metode default datang kepada kami. Metode default adalah metode yang diimplementasikan dalam antarmuka, ditandai dengan defaultkata kunci. Misalnya, metode terkenal stream()di Collectionantarmuka. Percayalah, antarmuka ini tidak sesederhana kelihatannya. Atau juga forEach()metode yang sama-sama terkenal diIterableantarmuka. Itu juga tidak ada sampai metode default ditambahkan. Omong-omong, Anda juga bisa membacanya di CodeGym di sini .

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

Jawaban sebelumnya tentang apa itu metode default menimbulkan pertanyaan lain. Jika Anda dapat mengimplementasikan metode dalam antarmuka, maka secara teoritis Anda dapat mengimplementasikan dua antarmuka dengan metode yang sama. Bagaimana kita melakukannya? Berikut adalah 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 kami memiliki kelas yang mengimplementasikan dua antarmuka ini. Tapi bagaimana kita memilih metode tertentu di antarmuka A atau B? Konstruksi khusus berikut memungkinkan ini: A.super.foo():

public class C implements A, B {
   public void fooA() {
       A.super.foo();
   }

   public void fooB() {
       B.super.foo();
   }
}
Dengan demikian, fooA()metode akan menggunakan foo()metode antarmuka default A, sedangkan fooB()metode akan menggunakan foo()metode antarmuka B.

16. Apa itu metode dan kelas abstrak?

Di Jawa, abstractadalah kata yang dilindungi undang-undang. Ini digunakan untuk menunjukkan kelas dan metode abstrak. Pertama, kita membutuhkan definisi. Metode abstrak adalah metode yang dideklarasikan menggunakan abstractkata kunci tanpa implementasi di kelas abstrak. Artinya, ini adalah metode seperti di antarmuka, tetapi dengan penambahan kata kunci, misalnya:

public abstract void foo();
Kelas abstrak adalah kelas yang juga ditandai dengan abstractkata kunci:

public abstract class A {

}
Kelas abstrak memiliki beberapa fitur:
  • Anda tidak dapat membuat objek dari kelas abstrak
  • itu dapat memiliki metode abstrak
  • mungkin juga tidak memiliki metode abstrak
Kelas abstrak diperlukan untuk abstraksi (maaf untuk tautologi) yang memiliki seperangkat perilaku dan status umum (yaitu, metode dan variabel). Kehidupan nyata penuh dengan contoh. Segala sesuatu di sekitar kita. "Hewan", "Mobil", "Sosok geometris", dan seterusnya.

17. Apa perbedaan antara String, StringBuilder dan StringBuffer?

Stringnilai disimpan dalam kumpulan string konstan. Segera setelah sebuah string dibuat, string tersebut muncul di kumpulan ini. Dan Anda tidak dapat menghapusnya. Misalnya:

String name = "book";
Variabel akan menunjuk ke kumpulan string konstan. 50 pertanyaan dan jawaban wawancara kerja teratas untuk Java Core.  Bagian 1 - 4Menyetel variabel nama ke nilai yang berbeda, kita memiliki:

name = "pen";
Kumpulan string konstan terlihat seperti ini: 50 pertanyaan dan jawaban wawancara kerja teratas untuk Java Core.  Bagian 1 - 5Dengan kata lain, kedua nilai tetap ada. Penyangga Tali:
  • Stringnilai disimpan dalam tumpukan. Jika suatu nilai diubah, maka nilai yang baru akan menggantikan yang lama.
  • String Bufferdisinkronkan dan karenanya aman untuk thread.
  • Karena keamanan benang, kinerjanya buruk.
Contoh:

StringBuffer name = “book”;
50 pertanyaan dan jawaban wawancara kerja teratas untuk Java Core.  Bagian 1 - 6Segera setelah nilai variabel nama berubah, nilai dalam tumpukan berubah: 50 pertanyaan dan jawaban wawancara kerja teratas untuk Java Core.  Bagian 1 - 7StringBuilder persis sama dengan StringBuffer, hanya saja tidak aman untuk thread. Akibatnya, ini terasa lebih cepat daripada StringBuffer.

18. Apa perbedaan antara kelas abstrak dan antarmuka?

Kelas abstrak:
  • Kelas abstrak memiliki konstruktor default. Itu dipanggil setiap kali turunan dari kelas abstrak dibuat.
  • Mereka dapat menyertakan metode abstrak dan non-abstrak. Secara umum, kelas abstrak tidak harus memiliki metode abstrak.
  • Kelas yang mewarisi kelas abstrak harus mengimplementasikan hanya metode abstrak.
  • Kelas abstrak dapat memiliki variabel instan (lihat Pertanyaan #5).
Antarmuka:
  • Antarmuka tidak memiliki konstruktor dan tidak dapat diinisialisasi.
  • Hanya metode abstrak yang dapat ditambahkan (kecuali untuk metode default).
  • Kelas yang mengimplementasikan antarmuka harus mengimplementasikan semua metode (kecuali untuk metode default).
  • Antarmuka hanya dapat memiliki konstanta.

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

Pertanyaan ini benar-benar ditanyakan dalam wawancara terakhir saya. Seperti yang saya pelajari kemudian, tujuan dari pertanyaan ini adalah untuk melihat bagaimana seseorang berpikir. Jelas, ada sedikit nilai praktis dalam pengetahuan ini. Sekedar mengetahui saja sudah cukup. Pertama, kita perlu mengklarifikasi bahwa O(1) adalah notasi untuk kompleksitas waktu dari algoritma "waktu konstan". Dengan kata lain, penunjukan ini menunjukkan waktu eksekusi tercepat. Untuk menjawab pertanyaan ini, kita perlu mempertimbangkan apa yang kita ketahui tentang array. Untuk membuat intarray, kita harus menulis yang berikut ini:

int[] intArray = new int[100];
Beberapa kesimpulan dapat ditarik dari sintaks ini:
  1. Ketika sebuah array dideklarasikan, tipenya diketahui. Jika jenisnya diketahui, maka ukuran setiap sel dalam array diketahui.
  2. Ukuran seluruh array diketahui.
Oleh karena itu, untuk memahami sel mana yang akan ditulisi, kita hanya perlu menghitung area memori mana yang akan ditulisi. Untuk komputer, ini sangat mudah. Komputer mengetahui di mana memori yang dialokasikan dimulai, jumlah elemen, dan ukuran setiap sel. Semua ini berarti bahwa tempat untuk menulis akan sama dengan tempat awal array + ukuran setiap sel dikalikan dengan indeks.

Jadi bagaimana kita sampai di O(1) saat mengakses objek di ArrayList?

Pertanyaan ini segera mengikuti yang sebelumnya. Yang benar adalah ketika bekerja dengan array yang menyimpan primitif, kita mengetahui sebelumnya (pada saat pembuatan) ukuran tipe elemen. Tapi apa yang kita lakukan jika kita memiliki hierarki pewarisan semacam ini dan 50 pertanyaan dan jawaban wawancara kerja teratas untuk Java Core.  Bagian 1 - 8kita ingin membuat koleksi untuk elemen tipe A dan menambahkan implementasi yang berbeda (B, C, dan 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 kita menghitung ukuran setiap sel? Bagaimanapun, setiap objek akan berbeda, mungkin dengan bidang tambahan yang berbeda. Apa yang harus dilakukan? Di sini pertanyaannya diajukan dengan cara yang dimaksudkan untuk membingungkan Anda. Kita tahu bahwa koleksi tidak secara langsung menyimpan objek. Itu hanya menyimpan referensi ke objek. Dan semua referensi memiliki ukuran yang sama, dan diketahui. Akibatnya, kami menghitung alamat di sini dengan cara yang sama seperti pada pertanyaan sebelumnya.

21. Autoboxing dan unboxing

Latar belakang sejarah: autoboxing dan unboxing adalah beberapa inovasi utama dalam JDK 5. Autoboxing adalah proses konversi otomatis dari tipe primitif ke kelas pembungkus yang sesuai. Unboxing adalah kebalikan dari autoboxing. Ini adalah proses mengubah kelas pembungkus menjadi primitif. Namun jika nilai pembungkusnya adalah null, maka a NullPointerExceptionakan dilempar saat unboxing.

Primitif dan pembungkusnya yang sesuai

Primitif kelas pembungkus
boolean Boolean
int Bilangan bulat
byte Byte
arang Karakter
mengambang Mengambang
panjang Panjang
pendek Pendek
dobel Dobel

// Autoboxing terjadi:

  • saat menetapkan primitif ke referensi ke kelas pembungkus:

    SEBELUM Jawa 5:

    
    // Manual boxing (the way it was BEFORE Java 5).
    public void boxingBeforeJava5() {
       Boolean booleanBox = new Boolean(true);
       Integer intBox = new Integer(3);
       // And so on for other types
    }
    
    After Java 5:
    // Automatic boxing (the way it became in Java 5).
    public void boxingJava5() {
       Boolean booleanBox = true;
       Integer intBox = 3;
       // And so on for other types
    }
    
  • ketika primitif dilewatkan sebagai argumen ke metode yang mengharapkan pembungkus:

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

// Unboxing terjadi:

  • ketika kami menetapkan instance kelas pembungkus ke variabel primitif:

    
    // 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;
    
  • Selama operasi aritmatika. Operasi hanya berlaku untuk tipe primitif, jadi diperlukan unboxing ke primitif.

    
    // BEFORE Java 5:
    Integer integerBox1 = new Integer(1);
    Integer integerBox2 = new Integer(2);
    
    // A comparison used to require this:
    integerBox1.intValue() > integerBox2.intValue()
          
    // In Java 5
    integerBox1 > integerBox2
    
  • saat meneruskan instance kelas pembungkus ke metode yang mengambil 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 digunakan?

Kata finalkunci dapat digunakan pada variabel, metode, dan kelas.
  1. Nilai variabel akhir tidak dapat diubah setelah diinisialisasi.
  2. Kelas terakhir steril :) Tidak bisa punya anak.
  3. Metode final tidak dapat ditimpa oleh keturunan.
Kami telah membahas hal-hal tingkat tinggi. Sekarang mari selami lebih dalam.

Variabel akhir

Java memberi kita dua cara untuk mendeklarasikan variabel dan memberikan nilai padanya:
  1. Anda dapat mendeklarasikan variabel dan menginisialisasi nanti.
  2. Anda dapat mendeklarasikan variabel dan menetapkan nilai segera.
Berikut adalah contoh yang menunjukkan penggunaan variabel akhir ini:

public class FinalExample {

   // A static final variable that is immediately initialized:
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";

   // A final variable that is not initialized, but will only work if you
   // initialize it 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);

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

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

Bisakah variabel akhir dianggap sebagai konstanta?

Karena kita tidak dapat menetapkan nilai baru ke variabel akhir, tampaknya ini adalah variabel konstan. Tapi hanya sekilas: Jika tipe data variabelnya adalah immutable, maka, ya, itu adalah konstanta. Tetapi jika tipe datanya adalah mutable, yaitu, dapat diubah, maka dimungkinkan untuk menggunakan metode dan variabel untuk mengubah nilai objek yang direferensikan oleh suatu finalvariabel. Karena itu, itu tidak bisa disebut konstanta. Contoh berikut menunjukkan bahwa beberapa variabel akhir benar-benar konstanta, sementara yang lain tidak, karena dapat diubah.

public class FinalExample {

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

   // Mutable final variables
   final List<String> addresses = new ArrayList();
   final StringBuilder finalStringBuilder = new StringBuilder("Constant?");
}

Variabel akhir lokal

Ketika sebuah finalvariabel dibuat dalam sebuah metode, itu disebut local finalvariabel:

public class FinalExample {

   public static void main(String[] args) {
       // You can do this
       final int minAgeForDriveCar = 18;

       // Or you can do this, in a for-each loop:
       for (final String arg : args) {
           System.out.println(arg);
       }
   }

}
Kita dapat menggunakan kata kunci final dalam perulangan for yang disempurnakan, karena variabel baru dibuat setelah setiap perulangan perulangan. Perlu diingat bahwa ini tidak berlaku untuk loop normal, jadi kita akan mendapatkan kesalahan waktu kompilasi.

// The final local j variable cannot be assigned
for (final int i = 0; i < args.length; i ++) {
   System.out.println(args[i]);
}

Kelas akhir

Kelas yang dideklarasikan sebagai finaltidak dapat diperpanjang. Sederhananya, tidak ada kelas lain yang bisa mewarisinya. Contoh kelas yang sangat baik finaldi JDK adalah String. Langkah pertama untuk membuat kelas yang tidak dapat diubah adalah menandainya sebagai final, sehingga mencegahnya diperpanjang:

public final class FinalExample {
}

// Compilation error!
class WantsToInheritFinalClass extends FinalExample {
}

Metode akhir

Ketika suatu metode ditandai final, itu disebut metode final (masuk akal, bukan?). Metode terakhir tidak dapat ditimpa di kelas anak. Kebetulan, metode wait() dan notify() dari kelas Object bersifat final, jadi kita tidak memiliki kemampuan untuk menimpanya.

public class FinalExample {
   public final String generateAddress() {
       return "Some address";
   }
}

class ChildOfFinalExample extends FinalExample {

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

Bagaimana dan di mana menggunakan final di Jawa

  • Gunakan kata kunci final untuk mendefinisikan beberapa konstanta tingkat kelas;
  • Buat variabel akhir untuk objek yang tidak ingin Anda ubah. Misalnya, properti khusus objek yang dapat kita gunakan untuk tujuan logging.
  • Jika Anda tidak ingin kelas diperpanjang, maka tandai sebagai final.
  • Jika Anda perlu membuat kelas yang tidak dapat diubah, Anda harus membuatnya final.
  • Jika Anda ingin penerapan metode tidak berubah pada turunannya, maka tandai metode tersebut sebagai final. Ini sangat penting untuk memastikan bahwa penerapannya tidak berubah.

23. Apa itu tipe yang bisa berubah dan tidak berubah?

Yg mungkin berubah

Objek yang dapat diubah adalah objek yang status dan variabelnya dapat diubah setelah dibuat. Contoh kelas yang bisa berubah termasuk StringBuilder dan 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());

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

Kekal

Objek yang tidak dapat diubah adalah objek yang status dan variabelnya tidak dapat diubah setelah objek dibuat. Kunci yang bagus untuk HashMap, bukan begitu? :) Misalnya, String, Integer, Double, dan sebagainya. Contoh:

// We'll 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;
   }

   // We remove the setter

   public static void main(String[] args) {

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

       // There is no way to change this field, so it is an immutable object
       // obj.setName("new address");
       // System.out.println(obj.getName());

   }
}
Pada bagian selanjutnya, kami mempertimbangkan pertanyaan dan jawaban tentang koleksi. Profil saya di GitHub Top 50 pertanyaan dan jawaban wawancara kerja untuk Java Core. Bagian 2
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION