Peran menggunakan final untuk memodifikasi parameter di java
Menambahkan kata kunci akhir sebelum parameter metode adalah untuk mencegah data dimodifikasi dalam bobot metode.
Ada dua situasi utama: pertama, gunakan final untuk memodifikasi tipe data dasar; Kedua, gunakan final untuk memodifikasi tipe data referensi.
Dalam kasus pertama, memodifikasi tipe data dasar, di mana nilai parameter tidak dapat dimodifikasi dalam badan metode, yaitu, itu tidak dapat dipindahkan. Kalau tidak, kompilasi tidak akan dilewati.
Kasing kedua adalah memodifikasi jenis referensi. Pada saat ini, objek yang dirujuk oleh variabel parameter tidak dapat diubah. Namun, untuk tipe data referensi, tidak masalah untuk memodifikasi propertinya.
Oleh karena itu, jika Anda ingin menggunakan kata kunci final, gunakan tipe data dasar, yang sangat berguna.
Variabel terakhir:
Gunakan final untuk tipe dasar: Ini konstan, nilainya konstan dan nilainya tetap tidak berubah.
Gunakan final untuk referensi objek: Buat referensi konstan dan setelah referensi diinisialisasi untuk menunjuk ke suatu objek, itu tidak dapat diubah untuk menunjuk ke objek lain. Namun, objek itu sendiri dapat dimodifikasi, dan Java tidak memberikan cara untuk membuat objek apa pun konstan. Keterbatasan ini juga menggunakan array, yang merupakan objek.
contoh:
nilai kelas {int i; nilai publik (int i) {this.i = i; }} public class finalData {private static acak acak = acak baru (47); ID string pribadi; public finalData (string id) {this.id = id; } private final int valueOne = 9; private static final int value_two = 99; Public static final int value_three = 39; private final int i4 = acak.nextint (20); static final int int_5 = random.nextInt (20); Nilai Pribadi V1 = Nilai Baru (11); nilai akhir pribadi v2 = nilai baru (22); nilai akhir private static val_3 = nilai baru (33); private final int [] a = {1, 2, 3, 4, 5, 6}; Public String ToString () {return id + ":" + "i4 =" + i4 + ", int_5 =" + int_5; } public static void main (string [] args) {finalData fd1 = finalData baru ("fd1"); //! fd1.valueone ++; // Karena ValueOne adalah konstanta tipe dasar, nilainya konstan FD1.V2.I ++; // Konten objek yang dimodifikasi oleh final dapat diubah fd1.v1 = nilai baru (9); untuk (int i = 0; i <fd1.a.length; i ++) fd1.a [i] ++; //! fd1.v2 = nilai baru (0); // Karena V2 adalah jenis referensi yang dimodifikasi berdasarkan final, rujukannya tidak dapat dimodifikasi untuk menunjuk ke objek lain //! fd1.val_3 = nilai baru (1); // Ini menempati ruang memori yang tidak dapat diubah //! fd1.a = int baru [3]; // final Modified Array System.out.println (FD1); System.out.println ("Membuat FinalData baru"); FinalData fd2 = finalData baru ("fd2"); System.out.println (FD1); System.out.println (FD2); }}/*output: fd1: i4 = 15, int_5 = 18creating finalDataFd1 baru: i4 = 15, int_5 = 18fd2: i4 = 13, int_5 = 18*//menganalisa:
Untuk FD1, FD2 dua objek, i4 adalah unik, yaitu, masing -masing objek memiliki i4, tetapi int_5 dinyatakan statis, yaitu, dibagikan oleh kelas, FD1 dan FD2 berbagi int_5, yang diinisialisasi pada saat pemuatan, daripada menginisialisasi setiap kali objek baru dibuat (misalnya, i4); Tetapi diatur ke final pada saat yang sama, sehingga rujukannya tidak dapat diubah, yaitu, tidak dapat dimodifikasi untuk menunjuk ke objek lain.
Final kosong:
dinyatakan sebagai final tetapi tidak memiliki nilai awal yang diberikan. Final harus ditetapkan menggunakan ekspresi dalam definisi domain atau di setiap konstruktor, itulah sebabnya domain akhir selalu diinisialisasi sebelum digunakan.
Parameter akhir:
Ini berarti Anda tidak dapat mengubah referensi parameter dalam metode untuk menunjuk ke parameter lain, tetapi Anda dapat memodifikasi apa yang ditunjuk oleh objek akhir
contoh:
kelas gizmo {int i = 0; public void spin () {}} kelas public finalGuments {void with (final gizmo g) {//! g = Gizmo baru (); // Referensi yang dimodifikasi oleh final tidak dimodifikasi untuk menunjuk ke objek lain G.I ++; // tetapi konten yang ditunjuk oleh objek akhir dapat dimodifikasi} batal tanpa (gizmo g) {g = Gizmo baru (); g.spin (); } // int g (final int i) {// //! i ++; // Karena parameter i adalah nilai konstan //} int g (final int i) {return i + 1; } public static void main (String [] args) {finalArguments bf = finalArguments baru (); bf.with (null); bf.with (null); }}menganalisa:
Parameter dinyatakan sebagai final. Jika itu adalah parameter dasar, itu adalah konstan dan tidak dapat dimodifikasi; Jika itu adalah variabel referensi, ia tidak dapat dimodifikasi untuk menunjuk ke objek lain, tetapi konten objek yang dirujuk oleh referensi dapat dimodifikasi.
Metode Fianl:
Alasan Penggunaan:
Semua metode pribadi di kelas secara implisit ditentukan sebagai final, dan karena metode pribadi tidak dapat digunakan, itu tidak dapat ditimpa. Pengubah akhir dapat ditambahkan ke metode pribadi, tetapi ini tidak memberikan makna tambahan pada metode ini.
contoh:
kelas withfinals {private final void f () {System.out.println ("withfinals.f ()"); } private void g () {System.out.println ("overridingPrivate.f ()"); }} class overridingPrivate meluas dengan finals {private final void f () {System.out.println ("overridingprivate.f ()"); }} class overridingPrivate2 Memperluas overridingPrivate { /** Saat menggunakan anotasi override untuk memaksa metode f () untuk menimpa metode f () dari kelas induk, kesalahan akan dilaporkan* karena tidak tahu apakah kelas induk memiliki metode. Untuk metode G (), itu hanya menghasilkan metode baru, dan * tidak menimpa metode G () di kelas induk. *///@override public final void f () {System.out.println ("overridingprivate2.f ()"); } public void g () {System.out.println ("overridingPrivate2.g ()"); }} kelas public finalOverridingillusion {public static void main (string [] args) {overridingprivate2 op2 = new overridingprivate2 (); op2.f (); op2.g (); // Anda dapat mengubah overridingprivate OP = OP2 ke atas; //! op.f (); // Metode terakhir di kelas induk tidak terlihat oleh subclass //! op.g (); Withfinals WF = OP2; // wf.f (); // wf.g (); }}/*output: overridridePrivate2.f () overridridePrivate2.g ()*/menganalisa:
Kapan cakupan terjadi:
1. Metode yang muncul di subkelas yang persis sama dengan kelas orang tua
2. Subkelas dapat diubah menjadi kelas induk ke atas dan memanggil metode di kelas induk
Jika metode di kelas induk dinyatakan sebagai final atau pribadi, maka metode ini tidak terlihat oleh subkelas. Bahkan jika metode persis sama dengan kelas induk dibuat di subkelas, ini adalah metode baru, bukan metode yang ditimpa dari kelas induk.
Kelas terakhir:
Artinya, kelas ini tidak dapat diwarisi, apakah itu Anda atau orang lain, yaitu kelas ini tidak memerlukan perubahan apa pun, juga tidak memerlukan subkelas, seperti kelas string.
contoh:
kelas SmallBrain {} Dinosaurus kelas akhir {int i = 7; int j = 1; SmallBrain X = New SmallBrain (); void f () {}} // Kesalahan: Tipe lebih lanjut tidak dapat menagih kelas akhir dinosaurus // kelas dinosaurus tidak dapat memiliki subkelas // kelas selanjutnya memperluas dinosaurus {} kelas publik Jurassic {public static void main (string [] args) {dinosaurus n = new dinosaurus (); nf (); ni = 40; N.J ++; }}Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.