JavaRush /Blog Jawa /Random-JV /Dadi final...

Dadi final...

Diterbitake ing grup
Ana tembung kunci ing basa jawa - final. Bisa ditrapake kanggo kelas, metode, variabel (kalebu argumen metode). Dadi pungkasan ... - 1Kanggo kelas, iki tegese kelas ora bisa duwe subclasses, i.e. Warisan dilarang. Iki migunani nalika nggawe immutableobyek (ora bisa diganti), contone, kelas Stringsing 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), finalamarga iki konsep bebarengan eksklusif. Kanggo cara finaltegese 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 finaltanpa kesalahan kompilasi. effectively finalVariabel 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.
  1. Apa sampeyan bisa ngomong babagan array nalika diumumake final?

  2. Dikenal yen kelas Stringkasebut immutable, kelas kasebut diumumake final, nilai string disimpen ing array char, sing ditandhani karo tembung kunci final.

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:
  1. Amarga array minangka obyek, sing finaltegese 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
  2. Ya, sampeyan bisa. Kuncine yaiku ngerteni panggunaan tembung barbed finalkaro 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 intlapangan lan nyoba kanggo ngganti Nilai liwat API Refleksi. Good luck kanggo kabeh!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION