1. Variabel akhir
Variabel akhir adalah konstanta yang tidak dapat diubah setelah diinisialisasi.
class test1 {final double pi = 3.14; // Nama konstanta adalah test publik terbaik yang dikapitalisasi1 () {pi = 3.14; } void test () {System.out.println ("pi adalah:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Keluaran:
PI adalah: 3.14
(1) variabel akhir kosong
Variabel akhir yang tidak diinisialisasi pada saat deklarasi disebut variabel akhir blank. Variabel akhir kosong harus diinisialisasi dalam konstruktor, jika tidak, kesalahan kompilasi akan dilemparkan.
class test1 {final double pi; Test1 () {pi = 3.14; // inisialisasi dalam konstruktor} void test () {System.out.println ("pi adalah:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Keluaran:
PI adalah: 3.14
(2) variabel akhir statis yang tidak diwariskan
Variabel akhir statis yang tidak diinisialisasi selama fase deklarasi hanya dapat diinisialisasi dalam blok kode statis.
class test1 {static final double pi; static {pi = 3.14; } void test () {System.out.println ("pi adalah:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Keluaran:
PI adalah: 3.14
2. Metode terakhir
Metode terakhir tidak dapat ditimpa. Dengan kata lain, subclass dapat memanggil metode fianl dari kelas induk, tetapi tidak bisa menimpanya.
tes kelas {static final double pi = 3.14; final void test () {System.out.println ("pi adalah:" + pi); }} class test1 memperluas tes {public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Keluaran:
PI adalah: 3.14
3. Kelas terakhir
Cals terakhir tidak dapat diwariskan
Test kelas akhir {static final double pi = 3.14; final void test () {System.out.println ("pi adalah:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Keluaran:
PI adalah: 3.14
PS: Mengapa kelas java.lang.string dirancang sebagai final?
Pertama -tama, Anda harus jelas tentang final kata kunci.
Final tampaknya tidak ingin berubah, tetapi ada dua alasan untuk tidak ingin berubah: desain atau efisiensi. Kelas yang dimodifikasi oleh final tidak dapat diwarisi, sehingga kelas yang dimodifikasi oleh final tidak dapat dirusak.
Setelah memahami ini, mari kita lihat masalahnya:
(1) dari perspektif desain,
A. Pastikan mereka tidak mengubah semantik di subkelas. Kelas string adalah kelas terakhir, yang berarti bahwa tidak ada yang diizinkan untuk mendefinisikan subclass dari suatu string. Dengan kata lain, jika ada referensi string, ia harus merujuk ke objek string, tetapi tidak dapat menjadi objek kelas lain.
B. String tidak dapat dimodifikasi setelah dibuat, karena perancang Java akan berbagi string. Paragraf berikut adalah komentar dalam kode sumber:
(2) Dari perspektif efisiensi:
A. Dirancang sebagai final, JVM tidak perlu meminta metode terkait dalam tabel fungsi virtual, tetapi secara langsung menempatkannya pada metode terkait kelas string, meningkatkan efisiensi eksekusi.
B. Desainer Java percaya bahwa berbagi membawa lebih banyak efisiensi.
Singkatnya, perlu untuk memastikan bahwa objek yang dirujuk oleh java.lang.string harus menjadi objek java.lang.string, bukan kelas yang merujuk keturunannya, untuk memastikan efisiensi dan keamanannya.