Kata kunci JAVA final digunakan untuk mengubah data, metode atau kelas, yang biasanya berarti "tidak dapat diubah", yaitu data tidak dapat diubah, metode tidak dapat ditimpa, dan kelas tidak dapat diwarisi. Umumnya ada dua alasan untuk menggunakan final: desain dan efisiensi. Saat versi JAVA diperbarui, beberapa masalah efisiensi dapat ditangani oleh kompiler dan JVM. Oleh karena itu, penggunaan final untuk menyelesaikan masalah efisiensi tidaklah begitu penting.
Pengubah Final sebagian besar digunakan di bidang tipe data primitif atau kelas yang tidak dapat diubah (jika semua metode di kelas tidak akan mengubah objeknya, kelas ini adalah kelas yang tidak dapat diubah. String adalah kelas yang tidak dapat diubah).
【data akhir】
Ada dua situasi utama di mana kata kunci Final digunakan untuk mengubah data:
1. Konstanta waktu kompilasi
2. Nilai diinisialisasi saat runtime
Untuk konstanta waktu kompilasi, ini mengacu pada bidang yang bersifat final dan statis (menurut konvensi, konstanta waktu kompilasi diberi nama dengan huruf kapital semua, dan setiap kata dipisahkan dengan garis bawah). tidak dapat diubah. Kompiler dapat mengganti konstanta waktu kompilasi ke dalam rumus penghitungan apa pun yang mungkin menggunakannya. Artinya, rumus penghitungan dapat dijalankan pada waktu kompilasi, yang secara relatif mengurangi beban waktu proses. Konstanta waktu kompilasi harus memiliki nilai yang ditetapkan ketika konstanta tersebut didefinisikan (tidak harus berupa tipe dasar).
Untuk nilai yang diinisialisasi saat runtime, untuk tipe dasar, final membuat nilai tidak dapat diubah; untuk referensi objek, final membuat referensi tidak dapat diubah, yaitu tidak dapat diubah untuk menunjuk ke objek lain. berlaku untuk array, array juga merupakan objek).
String akhir statis pribadi TESTD = "test";
String akhir statis publik TETE = "uji";
public static final String[] TESTF = {"1","2"}; //tipe non-dasar
String akhir statis pribadi[] TESTG = String baru[2];
public static void main(String args[]){
tes int akhirA = 1;
String terakhir tesB = "tes";
int terakhir[] tesC = {1,1,2,};
Sistem.keluar.println(testC[1]);
tesC[1] = 123;
Sistem.keluar.println(testC[1]);
}
}
JAVA memungkinkan pembuatan bidang akhir yang belum ditetapkan, tetapi bidang akhir harus ditetapkan berdasarkan definisi bidang atau di setiap konstruktor (sebanyak konstruktor) untuk memastikan bahwa bidang tersebut diinisialisasi sebelum digunakan. Dengan cara ini, final dapat digunakan dengan lebih fleksibel. Di kelas yang sama, nilai yang berbeda dapat ditetapkan ke objek yang berbeda dengan tetap mempertahankan karakteristik yang tidak dapat diubah.
publik javaBlankFinal(){
kosong = 2011;
}
public javaBlankFinal(int temp){
kosong = 2012;
}
public javaBlankFinal(Suhu string){
kosong = 2014;
}
public static void main(String args[]){
javaBlankFinal();
}
}
Ada dua alasan untuk menggunakan metode terakhir: pertama untuk mengunci metode untuk mencegah metode ditimpa dan memastikan bahwa perilaku metode tetap tidak berubah selama pewarisan; yang lainnya adalah untuk mengubah pemanggilan metode menjadi panggilan sebaris untuk mengurangi biaya metode panggilan. Namun pada versi terbaru, JVM dapat mengoptimalkan dirinya sendiri, sehingga tidak perlu menggunakan metode final untuk mengatasi masalah efisiensi.
Mengenai metode final, ada hal lain yang perlu diperhatikan. Semua metode privat di kelas secara implisit ditetapkan sebagai metode final (Anda juga dapat menambahkan modifikasi akhir pada metode tersebut, tetapi tidak ada artinya). Saat Anda mencoba mengganti metode privat, kompiler tidak melaporkan kesalahan, namun sebenarnya Anda tidak menimpa metode tersebut, Anda hanya membuat metode baru. Karena metode privat tidak dapat diakses oleh kelas eksternal, tentu saja tidak dapat di-override.
Menggunakan anotasi @Override dapat mencegah masalah di atas. Seperti yang ditunjukkan dalam program:
kekosongan akhir pribadi finalFunctionB(){
System.out.println("finalFunctionB");
}
kekosongan terakhir finalFunctionC(){
System.out.println("finalFunctionC");
}
fungsi kosongD(){}
}
class overrideFinalFunction memperluas finalFunction{
//@Override Tambahkan anotasi @Override untuk mengidentifikasi apakah ini merupakan override
kekosongan publik finalFunctionA(){
System.out.println("override finalFunctionA");
}
kekosongan akhir publik finalFunctionB(){
System.out.println("override finalFunctionB");
}
//final void finalFunctionC(){} //Tidak dapat mengganti metode final dari finalFunction
@Mengesampingkan
void functionD(){} //Metode penggantian sebenarnya
}
kelas publik javaFinalFunction memperluas finalFunction{
public static void main(String args[]){
finalFunction ff = finalFunction baru();
//ff.finalFunctionA(); //Tidak dapat memanggil metode pribadi
//ff.finalFunctionB();
overrideFinalFunction mati = overrideFinalFunction();
off.finalFunctionA(); //metode publik
mati.finalFunctionB();
}
}
Penggunaan kelas akhir umumnya untuk alasan desain, yang tidak memungkinkan kelas tersebut diwarisi. Hal ini memastikan bahwa perilaku kelas tidak akan berubah, dan juga dapat menghindari beberapa risiko keamanan. Semua metode di kelas Final secara implisit ditetapkan sebagai metode final dan oleh karena itu tidak dapat ditimpa (karena kelas final melarang pewarisan, metode di kelasnya tidak dapat ditimpa). Di Java core API, banyak contoh penerapan final, seperti java.lang.String. Tentukan final untuk kelas String untuk mencegah penimpaan metode seperti length().
Untuk field final, meskipun suatu kelas dinyatakan final, field yang ada di kelas tersebut tidak otomatis menjadi field final.
kelas publik javaFinalClass{
public static void main(String args[]){
finalClass fc = finalClass baru();
Sistem.keluar.println(fc.testA);
fc.testA = 2012;
Sistem.keluar.println(fc.testA);
}
}