JavaRush /Java Blog /Random-TL /Kaya final...

Kaya final...

Nai-publish sa grupo
Mayroong isang keyword sa java - final. Maaari itong ilapat sa mga klase, pamamaraan, variable (kabilang ang mga argumento ng pamamaraan). Kaya pangwakas... - 1Para sa isang klase, nangangahulugan ito na ang klase ay hindi maaaring magkaroon ng mga subclass, i.e. Ipinagbabawal ang mana. Ito ay kapaki-pakinabang kapag lumilikha ng immutable(hindi mababago) na mga bagay, halimbawa isang klase Stringna idineklara bilang final.
public final class String{
}

class SubString extends String{ //Compilation error
}
Dapat ding tandaan na ang modifier ay hindi mailalapat sa mga abstract na klase (na may keyword abstract), finaldahil ang mga ito ay kapwa eksklusibong mga konsepto. Para sa isang pamamaraan finalay nangangahulugan na hindi ito maaaring ma-override sa mga subclass. Ito ay kapaki-pakinabang kapag gusto naming hindi ma-override ang orihinal na pagpapatupad.
public class SuperClass{
    public final void printReport(){
        System.out.println("Report");
    }
}

class SubClass extends SuperClass{
    public void printReport(){  //Compilation error
        System.out.println("MyReport");
    }
}
Para sa mga primitive na uri ng variable, nangangahulugan ito na kapag naitalaga na, hindi na mababago ang value. Para sa mga reference na variable, nangangahulugan ito na kapag naitalaga na ang isang object, hindi na mababago ang reference sa object na iyon. Ito ay mahalaga! Ang link ay hindi mababago, ngunit ang estado ng bagay ay maaaring mabago. Sa java 8 lumitaw ang konsepto - effectively final. Nalalapat lamang ito sa mga variable (kabilang ang mga argumento ng pamamaraan). Ang punto ay sa kabila ng halatang kawalan ng keyword final, hindi nagbabago ang halaga ng variable pagkatapos ng pagsisimula. Sa madaling salita, maaari mong palitan ang isang salita para sa naturang variable finalnang walang error sa compilation. effectively finalMaaaring gamitin ang mga variable sa loob ng mga lokal na klase ( Local Inner Classes), anonymous na mga klase ( 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
}
Ngayon magkaroon tayo ng kaunting panayam. Pagkatapos ng lahat, ang layunin ng pagkuha ng kursong JavaRush ay maging isang developer ng Java at makakuha ng isang kawili-wili at mahusay na bayad na trabaho. Kaya, magsimula tayo.
  1. Ano ang masasabi mo tungkol sa isang array kapag ito ay ipinahayag final?

  2. Ito ay kilala na ang klase Stringay immutable, ang klase ay ipinahayag final, ang halaga ng string ay naka - imbak sa isang array char, na kung saan ay minarkahan ng keyword final.

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
Posible bang palitan ang halaga ng isang bagay String(nang hindi binabago ang sanggunian sa bagay)? Ito ay mga totoong tanong sa panayam. And as practice shows, marami ang sumasagot sa kanila ng mali. Ang pag-unawa sa paggamit ng keyword final, lalo na para sa mga reference na variable, ay napakahalaga. Habang nag-iisip ka, isang mabilis na paglihis sa koponan ng JavaRush. Mangyaring magdagdag ng isang bloke sa iyong text editor na nagbibigay-daan sa iyong itago ang nilalaman, at kapag nag-click ka dito, ipakita ang nilalamang ito. Mga sagot:
  1. kasi ang array ay isang object, na finalnangangahulugan na pagkatapos magtalaga ng reference sa isang object, hindi na ito mababago, ngunit ang estado ng object ay maaaring baguhin.

    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. Oo kaya mo. Ang susi ay upang maunawaan ang paggamit ng barbed na salita finalna may mga bagay. Gumagamit ng ReflectionAPI upang palitan ang halaga.

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
         */
    }
}
Pakitandaan na kung sinubukan naming baguhin ang panghuling variable ng isang primitive na uri sa ganitong paraan, walang gagana. Iminumungkahi kong kumbinsihin mo ang iyong sarili tungkol dito: lumikha ng isang Java class, halimbawa, na may final intisang field at subukang baguhin ang halaga nito sa pamamagitan ng Reflection API. Sana swertihin ang lahat!
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION