Di Java, kata kunci terakhir digunakan untuk menyatakan bahwa objek tersebut tidak dapat diubah. Objek di sini termasuk variabel, metode, dan kelas, yang mirip dengan kata kunci const dalam C ++.
Immutable berarti bahwa setelah objek dibuat, negara tidak dapat diubah. Anda dapat mempertimbangkan menggunakan kata kunci akhir dari tiga perspektif:
variabel akhir
Tentukan objek akhir A, maka A hanya dapat diinisialisasi sekali. Setelah diinisialisasi, data A tidak dapat dimodifikasi. Jika A adalah tipe referensi, objek lain tidak dapat disusun kembali.
Variabel akhir yang tidak diinisialisasi disebut blank final. Jika itu adalah variabel anggota, itu harus diinisialisasi atau ditetapkan dalam konstruktor.
contoh:
Lingkaran kelas {static final double pi = 3.1415926; Radius int akhir = 5; Final int xpos; final int ypos; lingkaran publik (int x, int y) {xpos = x; ypos = y; }} Metode terakhir
Jika Anda mendefinisikan metode final, metode ini tidak dapat kelebihan beban. Metode desainer tidak ingin fungsi terkait lainnya terjadi karena kelebihan metode.
contoh:
class Baseclass {public final void Method () {}} kelas DerivedClass memperluas Baseclass {Metode void akhir publik () {} // Kesalahan Kompilasi}Perlu dicatat bahwa definisi metode akhir mungkin tidak selalu menghasilkan efek inline, karena apakah metode ini tergantung pada strategi JVM, daripada kata kunci akhir, tidak akurat untuk meningkatkan efisiensi metode melalui desain akhir.
kelas terakhir
Kelas akhir X yang ditentukan oleh Kelas Akhir X tidak dapat diwarisi.
Di Java, kelas string dirancang sebagai final, dan definisinya adalah sebagai berikut
Salinan kode adalah sebagai berikut:
String akhir kelas publik memperluas objek mengimplementasikan serializable, sebanding <string>, charsequence
Kelas internal dan final
Saat mendefinisikan kelas dalam anonim dalam suatu metode, kelas dalam hanya dapat mengakses variabel tipe akhir dalam metode ini, sehingga kompiler Java dapat menangkap nilai variabel di muka dan menyimpan salinan di kelas dalam. Ketika metode ini dihancurkan, ruang memori kelas dalam masih lengkap.
contoh:
wrapper kelas publik {public static void main (string [] args) {// objek obj = null; // Kompilasi kesalahan objek akhir obj = null; utas baru (runnable baru () {public void run () {obj = "hello";}}). start (); }} PS: Masalah bahwa kelas anonim internal tidak dapat mengakses variabel non-final eksternal
Ini kedengarannya agak sulit untuk dibicarakan, tetapi pada kenyataannya, saya ingin berbicara lebih banyak tentang beberapa fitur kelas internal Java.
Alasan saya memikirkan pertanyaan ini adalah bahwa ketika saya membaca kode tentang HTTP Keepalive dalam kode sumber JDK baru -baru ini, salah satu file sumber, sun.net.www.protocol.http.httpurlconnection.java, secara tidak sengaja melihat kode berikut.
Hasil boolean akhir [] = {false}; java.security.accesscontroller.dopriviled (java.security.privilegedAction () {public run () {coba {inetaddress a2 = inetaddress (h1); A1.Equals (A2);Kelas internal anonim Java tidak dapat mengakses variabel non-final dari fungsi yang sesuai. Untuk mengakses variabel lokal eksternal, variabel ini harus didefinisikan sebagai fianl terlebih dahulu. Namun, setelah didefinisikan sebagai final, nilai variabel ini tidak dapat dimodifikasi dalam kelas internal anonim, sehingga tidak mudah untuk mengembalikan beberapa nilai yang berguna dalam kelas internal anonim. Kode ini menggunakan metode yang sangat pintar, menggunakan array di sini untuk melewati batasan ini. Meskipun kami tidak dapat memodifikasi referensi ke hasil variabel, kami dapat memodifikasi konten array yang ditunjukkan oleh hasil.
Saya hanya ingin merekam sedikit trik untuk memodifikasi variabel eksternal dengan kelas anonim internal. Tetapi karena Anda telah tiba di sini, Anda mungkin terus melihat fitur atau batasan apa yang dimiliki kelas internal.
Sebelum melanjutkan artikel ini, saya merasa sangat penting untuk mengklarifikasi beberapa istilah Java yang terlibat dalam artikel ini. Istilah -istilah ini tidak mudah diterjemahkan ke dalam bahasa Mandarin, jadi kami masih akan menggambarkannya dalam bahasa Inggris.
// Ini adalah kelas ClassPublic Class Javaterm {// Field atau Variabel Anggota Private Int Field; // konstruktor public javaterm () {} // metode public void metode () {// variabel lokal int localvariable = 0; // kelas lokal class localclass {public localclass () {}} // kelas anonim runnable baru () {public void run () {}}; }}Hari ini kita akan lebih fokus pada kelas lokal dan kelas anonim, yang keduanya termasuk dalam kelas dalam.
Java memungkinkan kita untuk mendefinisikan kelas lain di kelas, yang disebut kelas bersarang, dan kelas bersarang dapat dibagi menjadi dua kategori, satu adalah kelas bersarang statis, dan yang lainnya adalah kelas bersarang non-statis, juga dikenal sebagai kelas dalam. Kelas dalam juga dapat dibagi menjadi kelas lokal dan kelas anonim.
Beberapa keterbatasan kelas anonim