JavaRush /Блоги Java /Random-TG /Пас, ниҳоӣ ...
Алексей
Сатҳи

Пас, ниҳоӣ ...

Дар гурӯҳ нашр шудааст
Дар java калимаи калидӣ мавҷуд аст - final. Он метавонад ба синфҳо, усулҳо, тағирёбандаҳо (аз ҷумла далелҳои методӣ) татбиқ карда шавад. Ҳамин тавр ниҳоӣ... - 1Барои синф ин маънои онро дорад, ки синф наметавонад зерсинфҳо дошта бошад, яъне. Мерос манъ аст. Ин ҳангоми сохтани immutablean objectҳои (тағирнопазир) муфид аст, масалан синфе, Stringки ҳамчун final.
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");
    }
}
Барои тағирёбандаҳои навъи ибтидоӣ ин маънои онро дорад, ки пас аз таъин кардани арзиш тағир дода намешавад. Барои тағирёбандаҳои истинод, ин маънои онро дорад, ки вақте ки an object таъин карда мешавад, истинод ба ин an object тағир дода намешавад. Муҳим аст! Пайвандро тағир додан мумкин нест, аммо ҳолати an objectро тағир додан мумкин аст. Бо Java 8 консепсия пайдо шуд - effectively final. Он танҳо ба тағирёбандаҳо дахл дорад (аз ҷумла далелҳои методӣ). Гап дар он аст, ки сарфи назар аз мавҷуд набудани калимаи калидӣ final, арзиши тағирёбанда пас аз оғозёбӣ тағир намеёбад. Ба ибораи дигар, шумо метавонед калимаро барои чунин тағирёбанда finalбе хатогии тартибдиҳӣ иваз кунед. effectively finalТағирёбандаҳоро дар дохor синфҳои маҳаллӣ ( Local Inner Classes), синфҳои беном ( Anonymous Inner Classes), ҷараёнҳо (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
}
Акнун биёед каме мусоҳиба кунем. Дар ниҳоят, ҳадаф аз гирифтани курси JavaRush ин аст, ки таҳиягари Java шудан ва ба даст овардани кори ҷолиб ва музднок аст. Пас, биёед оғоз кунем.
  1. Ҳангоми эълон кардани массив шумо дар бораи он чӣ гуфта метавонед final?

  2. Маълум аст , ки синф Stringаст immutable, синф эълон карда мешавад final, арзиши сатр дар массив нигоҳ дошта мешавад char, ки бо калимаи калидӣ қайд карда мешавад final.

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
Оё арзиши an objectро иваз кардан мумкин аст String(бе тағир додани истинод ба an object)? Инҳо саволҳои воқеии мусоҳиба мебошанд. Ва чунон ки таҷриба нишон медиҳад, бисёриҳо ба онҳо нодуруст ҷавоб медиҳанд. Фаҳмидани истифодаи калимаи калидӣ final, махсусан барои тағирёбандаҳои истинод, хеле муҳим аст. Ҳангоме ки шумо фикр мекунед, як дурнамои зуд ба дастаи JavaRush. Лутфан дар муҳаррири матнии худ блоке илова кунед, ки ба шумо имкон медиҳад мундариҷаро пинҳон кунед ва вақте ки шумо онро пахш мекунед, ин мундариҷаро нишон диҳед. Ҷавобҳо:
  1. Зеро массив an object аст, ки finalмаънои онро дорад, ки пас аз таъини истинод ба an object, онро дигар тағир додан мумкин нест, аммо ҳолати an objectро тағир додан мумкин аст.

    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бо ашё. Барои иваз кардани арзиш 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