Ana tembung kunci ing basa jawa -
final
. Bisa ditrapake kanggo kelas, metode, variabel (kalebu argumen metode). Kanggo kelas, iki tegese kelas ora bisa duwe subclasses, i.e. Warisan dilarang. Iki migunani nalika nggawe immutable
obyek (ora bisa diganti), contone, kelas String
sing diumumake minangka final
.
public final class String{
}
class SubString extends String{ //Compilation error
}
Sampeyan uga kudu dicathet yen modifier ora bisa ditrapake ing kelas abstrak (kanthi tembung kunci abstract
), final
amarga iki konsep bebarengan eksklusif. Kanggo cara final
tegese ora bisa diganti ing subclasses. Iki migunani nalika kita pengin implementasine asli ora bakal ditindhes.
public class SuperClass{
public final void printReport(){
System.out.println("Report");
}
}
class SubClass extends SuperClass{
public void printReport(){ //Compilation error
System.out.println("MyReport");
}
}
Kanggo variabel jinis primitif, iki tegese yen ditugasake, nilai kasebut ora bisa diganti. Kanggo variabel referensi, iki tegese yen obyek ditugasake, referensi kanggo obyek kasebut ora bisa diganti. Iku penting! Link ora bisa diganti, nanging kahanan obyek bisa diganti. Kanthi java 8 konsep muncul - effectively final
. Iki mung ditrapake kanggo variabel (kalebu argumen metode). Intine yaiku sanajan ora ana tembung kunci sing jelas final
, nilai variabel ora owah sawise diinisialisasi. Ing tembung liya, sampeyan bisa ngganti tembung kanggo variabel kasebut final
tanpa kesalahan kompilasi. effectively final
Variabel bisa digunakake ing kelas lokal ( Local Inner Classes
), kelas anonim ( Anonymous Inner Classes
), stream (Stream API).
public void someMethod(){
// In the example below, both a and b are effectively final, since the values are set once:
int a = 1;
int b;
if (a == 2) b = 3;
else b = 4;
// c is NOT effectively final because value changes
int c = 10;
c++;
Stream.of(1, 2).forEach(s-> System.out.println(s + a)); //Ок
Stream.of(1, 2).forEach(s-> System.out.println(s + c)); //Compilation error
}
Saiki ayo wawancara sethithik. Sawise kabeh, tujuan njupuk kursus JavaRush yaiku dadi pangembang Java lan entuk proyek sing menarik lan dibayar kanthi apik. Dadi, ayo miwiti.
-
Apa sampeyan bisa ngomong babagan array nalika diumumake
final
? -
Dikenal yen kelas
String
kasebutimmutable
, kelas kasebut diumumakefinal
, nilai string disimpen ing arraychar
, sing ditandhani karo tembung kuncifinal
.
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
Apa bisa ngganti nilai obyek String
(tanpa ngganti referensi kanggo obyek)? Iki minangka pitakonan wawancara nyata. Lan minangka praktik nuduhake, akeh sing mangsuli kanthi salah. Pangertosan panggunaan tembung kunci final
, utamane kanggo variabel referensi, penting banget. Nalika sampeyan lagi mikir, digression cepet menyang tim JavaRush. Tambahake blok ing editor teks sing ngidini sampeyan ndhelikake konten kasebut, lan nalika sampeyan ngeklik, nuduhake konten kasebut. Wangsulan:
-
Amarga array minangka obyek, sing
final
tegese sawise menehi referensi kanggo obyek, ora bisa diganti maneh, nanging kahanan obyek bisa diganti.final int[] array = {1,2,3,4,5}; array[0] = 9; //ok, because change the contents of the array - {9,2,3,4,5} array = new int[5]; //compile error
-
Ya, sampeyan bisa. Kuncine yaiku ngerteni panggunaan tembung barbed
final
karo obyek. Gunakake ReflectionAPI kanggo ngganti nilai kasebut.
import java.lang.reflect.Field;
class B {
public static void main(String[] args) throws Exception {
String value = "Old value";
System.out.println(value);
//Get the value field in the String class
Field field = value.getClass().getDeclaredField("value");
//Let's change it
field.setAccessible(true);
//Set new value
field.set(value, "JavaRush".toCharArray());
System.out.println(value);
/* Вывод:
* Old value
* JavaRush
*/
}
}
Elinga yen kita nyoba ngganti variabel pungkasan saka jinis primitif kanthi cara iki, ora ana sing bisa digunakake. Aku suggest sampeyan gawe uwong yakin dhewe iki: nggawe kelas Jawa, contone, karo final int
lapangan lan nyoba kanggo ngganti Nilai liwat API Refleksi. Good luck kanggo kabeh!
GO TO FULL VERSION