CodeGym /Java Blog /Acak /Mari Kita Bicara Tentang Kata Kunci Terakhir Di Jawa
John Squirrels
Level 41
San Francisco

Mari Kita Bicara Tentang Kata Kunci Terakhir Di Jawa

Dipublikasikan di grup Acak
Java memiliki kata kunci ini — final. Itu dapat diterapkan ke kelas, metode, variabel (termasuk parameter metode). Untuk sebuah kelas, kata kunci final berarti bahwa kelas tersebut tidak dapat memiliki subkelas, yaitu pewarisan dilarang... Ini berguna saat membuat objek yang tidak dapat diubah (tidak dapat diubah). Sebagai contoh, kelas String dideklarasikan sebagai final.

    public final class String {
    }
    
    class SubString extends String { // Compilation error
    }
Saya juga harus mencatat bahwa pengubah final tidak dapat diterapkan ke kelas abstrak (yang memiliki kata kunci abstrak), karena ini adalah konsep yang saling eksklusif. Untuk metode terakhir, pengubah berarti bahwa metode tersebut tidak dapat ditimpa dalam subkelas. Ini berguna ketika kita ingin mencegah perubahan implementasi asli.

    public class SuperClass {
        public final void printReport() {
            System.out.println("Report");
        }
    }

    class SubClass extends SuperClass { 
        public void printReport() { //Compilation error
            System.out.println("MyReport");
        }
    }
Untuk variabel bertipe primitif, kata kunci final berarti bahwa nilainya, setelah ditetapkan, tidak dapat diubah. Untuk variabel referensi, artinya setelah objek ditetapkan, Anda tidak dapat mengubah referensi ke objek tersebut. Ini penting! Referensi tidak dapat diubah, tetapi status objek dapat diubah. Java 8 memperkenalkan konsep baru: efektif final. Ini hanya berlaku untuk variabel (termasuk parameter metode). Intinya adalah bahwa meskipun kata kunci final tidak ada, nilai variabel tidak berubah setelah inisialisasi. Dengan kata lain, kata kunci final dapat diterapkan ke variabel tersebut tanpa kesalahan kompilasi. Variabel akhir yang efektif dapat digunakan di dalam kelas lokal (kelas dalam lokal), kelas anonim (kelas dalam anonim), dan aliran (Stream API).

        public void someMethod() {
            // In the example below, both a and b are effectively final, since they are assigned values only once:
            int a = 1;
            int b;
            if (a == 2) b = 3;
            else b = 4;
            // c is NOT effectively final since its value changes
            int c = 10;
            c++;
            
            Stream.of(1, 2).forEach(s-> System.out.println(s + a)); // OK
            Stream.of(1, 2).forEach(s-> System.out.println(s + c)); // Compilation error
        }
Sekarang, mari kita wawancara kecil. Lagi pula, tujuan menyelesaikan kursus CodeGym adalah menjadi pengembang Java dan mencari pekerjaan yang menarik dan bergaji tinggi. Jadi, mari kita mulai.
  1. Apa yang bisa kita katakan tentang array yang dinyatakan final?

  2. Kita tahu bahwa kelas String tidak dapat diubah: kelas dinyatakan final. Nilai string disimpan dalam array char yang ditandai dengan kata kunci final.


public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

Bisakah kita mengganti nilai objek String (tanpa mengubah referensi ke objek)? Ini adalah pertanyaan wawancara nyata. Dan praktik menunjukkan bahwa banyak kandidat yang tidak menjawabnya dengan benar. Memahami bagaimana kata kunci final digunakan, terutama untuk variabel referensi, sangatlah penting. Saat Anda merenungkan ini, saya akan membuat permintaan kecil ke tim CodeGym. Tolong beri editor teks kemampuan untuk menambahkan blok yang isinya dapat ditampilkan/disembunyikan ketika Anda mengkliknya. Jawaban:
  1. Array adalah objek, jadi kata kunci terakhir berarti bahwa setelah referensi ke array ditetapkan, referensi tidak dapat diubah. Yang mengatakan, Anda dapat mengubah keadaan objek.

    
            final int[] array = {1, 2, 3, 4, 5};
            array[0] = 9;	 // OK, because we're changing the contents of the array: {9, 2, 3, 4, 5}
            array = new int[5]; // Compilation error
    
  2. Ya kita bisa. Hal utama adalah untuk memahami apa arti kata kunci terakhir berduri ketika digunakan dengan objek. Reflection API dapat digunakan untuk mengganti nilai.


import java.lang.reflect.Field;

class B {
    public static void main(String[] args) throws Exception {
        String value = "Old value";
        System.out.println(value);

        // Get the String class's value field
        Field field = value.getClass().getDeclaredField("value");
        // Make it mutable
        field.setAccessible(true);
        // Set a new value
        field.set(value, "CodeGym".toCharArray());

        System.out.println(value);

        /* Output:
         * Old value
         * CodeGym
         */
    }
}
Harap perhatikan bahwa jika kami mencoba mengubah variabel terakhir dari tipe primitif dengan cara ini, maka tidak akan terjadi apa-apa. Saya sarankan Anda meyakinkan diri sendiri: buat kelas Java, misalnya, dengan bidang int final dan coba ubah nilainya menggunakan API Refleksi. Semoga sukses untuk semua!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION