kelas terakhir
Kelas terakhir tidak dapat diwariskan. Pada saat yang sama, setelah kelas dimodifikasi dengan final, itu berarti bahwa semua metode di kelas akhir secara implisit ditentukan sebagai metode akhir.
Metode terakhir
Selama proses warisan kelas, subkelas tidak dapat dimodifikasi atau ditimpa untuk metode akhir di kelas induk.
Metode pribadi semuanya secara implisit ditentukan sebagai metode akhir.
Ada dua alasan untuk menggunakan metode akhir:
variabel akhir
Kata kunci akhir adalah metode yang paling umum digunakan untuk memodifikasi variabel. Jika variabel anggota dimodifikasi, itu harus diinisialisasi pada saat definisi atau dalam konstruktor, dan tidak ada penugasan yang dapat dilakukan setelah inisialisasi.
Ada berbagai makna untuk tipe dasar dan objek kelas:
Bidang akhir statis disebut konstanta periode kompilasi dan umumnya dikapitalisasi.
Contoh
kelas Glyph {void draw () {System.out.println ("Glyph.Draw ()"); } Glyph () {System.out.println ("glyph () sebelum draw ()"); menggambar(); System.out.println ("Glyph () setelah draw ()"); }} kelas RoundGlyph memperluas Glyph {private int redius = 1; Roundglyph (int r) {radius = r; System.out.println ("Roundglyph.roundglyph (), Radius =" + radius); } void draw () {System.out.println ("Roundglyph.Draw (), Radius =" + radius); }} kelas publik rolyconstructors {public static void main (string [] args) {new roundglyph (5); }} Hasil output:
Glyph () sebelum draw () roundglyph.draw (), radius = 0glyph () setelah draw () roundglyph.roundglyph (), radius = 5
Kode di atas menunjukkan proses inisialisasi kelas dan masalah bencana tersembunyi.
Fungsi utama memanggil konstruktor Gglyph dengan Parameter 5 untuk membuat objek GRETGLYPH, dan konstruktor GRYGLYPH dari kelas induknya yang dipanggil sebelum konstruktor GRETGLYPH dieksekusi.
Namun, metode penarikan dipanggil dalam konstruktor mesin terbang kelas induk. Karena polimorfisme, metode penarikan subkelas sebenarnya disebut. Namun, Redius subclass belum diinisialisasi melalui konstruktor saat ini, jadi outputnya adalah:
Roundglyph.draw (), radius = 0
Ini jelas bukan hasil yang kita inginkan, jadi penting untuk dicatat:
Alasan kedua adalah bahwa final tidak akan menerapkan polimorfisme, sehingga dapat dijamin bahwa metode yang sesuai dari objek saat ini disebut, daripada metode override subclass yang belum dilakukan dalam pekerjaan inisialisasi.
Merangkum metode alokasi memori final:
1. Modifikasi variabel:
Secara umum, ada tiga tempat di mana variabel akhir dapat ditetapkan: penugasan langsung, di konstruktor, atau di blok inisialisasi.
(1) Inisialisasi:
Karena deklarasi dan inisialisasi dikaitkan dengan sintaks Java,
Dengan kata lain: jika Anda tidak menampilkan variabel inisialisasi, sistem akan secara otomatis menginisialisasi dengan nilai default. (Jika int adalah 0)
Untuk variabel akhir, jika Anda tidak menetapkan nilai saat dinyatakan, sistem default ke bidang kosong ini, yang diinisialisasi dalam konstruktor.
Jika statis, Anda dapat menginisialisasi blok.
(2) Memori:
Metode pemrosesan konstanta (variabel akhir) dan variabel non-final berbeda.
Ketika masing -masing tipe menggunakan konstanta, itu akan menyalin salinan ke kumpulan konstannya sendiri.
Konstanta juga disimpan dalam area metode seperti variabel kelas (statis), tetapi mereka disimpan di kolam konstan.
(Mungkin, variabel kelas dibagikan oleh semua contoh, sedangkan kumpulan konstan unik untuk setiap contoh.)
2. Metode Modifikasi:
Ini disimpan di area metode dan dapat diganti secara langsung dengan kode fungsi tanpa menunggu sampai eksekusi untuk memutuskan fungsi mana yang spesifik.
3. Kategori Modifikasi:
Simpan di area metode.