JavaRush /Java блогы /Random-KK /Сонымен, соңғы ...
Алексей
Деңгей

Сонымен, соңғы ...

Топта жарияланған
Java тілінде - кілт сөзі бар final. Оны сыныптарға, әдістерге, айнымалыларға (әдіс аргументтерін қоса) қолдануға болады. Сонымен финал... - 1Класс үшін бұл сыныптың ішкі сыныптары болуы мүмкін емес дегенді білдіреді, яғни. Мұрагерлікке тыйым салынады. Бұл (өзгермейтін) нысандарды жасау кезінде пайдалы , мысалы ретінде жарияланған immutableсынып . Stringfinal
public final class String{
}

class SubString extends String{ //Compilation error
}
Сондай-ақ модификаторды абстрактілі сыныптарға қолдануға болмайтынын ескеру керек (кілт сөзімен abstract), finalсебебі бұл бір-бірін жоққа шығаратын ұғымдар. Әдіс үшін finalоны ішкі сыныптарда қайта анықтау мүмкін емес дегенді білдіреді. Бұл бастапқы енгізудің қайта анықталмағанын қалаған кезде пайдалы.
public class SuperClass{
    public final void printReport(){
        System.out.println("Report");
    }
}

class SubClass extends SuperClass{
    public void printReport(){  //Compilation error
        System.out.println("MyReport");
    }
}
Қарапайым түрдегі айнымалылар үшін бұл тағайындалған соң мәнді өзгерту мүмкін емес дегенді білдіреді. Сілтеме айнымалылары үшін бұл нысан тағайындалғаннан кейін сол нысанға сілтемені өзгерту мүмкін емес дегенді білдіреді. Бұл маңызды! Сілтемені өзгерту мүмкін емес, бірақ нысанның күйін өзгертуге болады. Java 8-де тұжырымдама пайда болды - effectively final. Ол тек айнымалыларға (әдіс аргументтерін қоса) қолданылады. Мәселе мынада, кілт сөзінің анық болмауына қарамастан final, айнымалының мәні инициализациядан кейін өзгермейді. Басқаша айтқанда, мұндай айнымалы сөзді finalкомпиляция қатесісіз ауыстыруға болады. Айнымалыларды жергілікті сыныптар ( ), анонимдік сыныптар ( ), ағындар (Stream API) effectively finalішінде пайдалануға болады .Local Inner ClassesAnonymous Inner Classes
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
}
Енді шағын сұхбат берейік. Өйткені, JavaRush курсын өтудің мақсаты - Java әзірлеушісі болу және қызықты және жақсы төленетін жұмысқа орналасу. Сонымен, бастайық.
  1. Массив жарияланған кезде ол туралы не айта аласыз final?

  2. StringКласс екені белгілі immutable, класс жарияланады , жолдың мәні түйінді сөзбен белгіленген finalмассивте сақталады .charfinal

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
Нысанның мәнін ауыстыру мүмкін бе String(нысанға сілтемені өзгертпей)? Бұл нағыз сұхбат сұрақтары. Тәжірибе көрсеткендей, көпшілігі оларға қате жауап береді. Негізгі сөзді пайдалануды түсіну final, әсіресе анықтамалық айнымалылар үшін, өте маңызды. Сіз ойланып жатқанда, JavaRush командасына жылдам өту. Мәтіндік редакторға мазмұнды жасыруға мүмкіндік беретін блокты қосыңыз және оны басқан кезде осы мазмұнды көрсетіңіз. Жауаптары:
  1. Өйткені массив an object болып табылады, finalяғни нысанға сілтеме тағайындалғаннан кейін оны енді өзгертуге болмайды, бірақ нысанның күйін өзгертуге болады.

    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. Иә болады. finalЕң бастысы - тікенді сөздің an objectілермен қолданылуын түсіну . Мәнді ауыстыру үшін ReflectionAPI пайдаланады.

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
         */
    }
}
Қарапайым түрдің соңғы айнымалысын осылайша өзгертуге тырыссақ, ештеңе жұмыс істемейтінін ескеріңіз. Мен сізге осыған көз жеткізуді ұсынамын: Java класын жасаңыз, мысалы, өріспен final intжәне оның мәнін Reflection API арқылы өзгертуге тырысыңыз. Бәріңе сәттілік!
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION