JavaRush /Java blogi /Random-UZ /Shunday qilib, yakuniy ...

Shunday qilib, yakuniy ...

Guruhda nashr etilgan
Java-da kalit so'z mavjud final. U sinflar, usullar, o'zgaruvchilar (jumladan, usul argumentlari) uchun qo'llanilishi mumkin. Yakuniy... - 1Sinf uchun bu sinfning pastki sinflarga ega bo'lishi mumkin emasligini anglatadi, ya'ni. Merosga berish taqiqlangan. Bu (o'zgarmas) ob'ektlarni yaratishda foydalidir immutable, masalan, sinf Stringsifatida e'lon qilingan final.
public final class String{
}

class SubString extends String{ //Compilation error
}
Shuni ham ta'kidlash kerakki, modifikatorni mavhum sinflarga qo'llash mumkin emas (kalit so'z bilan abstract), finalchunki bular bir-birini inkor etuvchi tushunchalardir. Usul uchun finaluni pastki sinflarda bekor qilib bo'lmaydi. Bu asl dastur bekor qilinmasligini istasak foydali bo'ladi.
public class SuperClass{
    public final void printReport(){
        System.out.println("Report");
    }
}

class SubClass extends SuperClass{
    public void printReport(){  //Compilation error
        System.out.println("MyReport");
    }
}
Primitiv turdagi o'zgaruvchilar uchun bu bir marta tayinlangandan so'ng qiymatni o'zgartirib bo'lmaydi degan ma'noni anglatadi. Malumot o'zgaruvchilari uchun bu ob'ekt tayinlangandan so'ng, ushbu ob'ektga havolani o'zgartirib bo'lmasligini anglatadi. Bu muhim! Havolani o'zgartirib bo'lmaydi, lekin ob'ekt holatini o'zgartirish mumkin. Java 8 bilan kontseptsiya paydo bo'ldi - effectively final. U faqat o'zgaruvchilar uchun amal qiladi (shu jumladan, usul argumentlari). Gap shundaki, kalit so'zning aniq yo'qligiga qaramay final, o'zgaruvchining qiymati ishga tushirilgandan keyin o'zgarmaydi. finalBoshqacha qilib aytganda, kompilyatsiya xatosisiz bunday o'zgaruvchiga so'zni almashtirishingiz mumkin . O'zgaruvchilar mahalliy sinflar ( ), anonim sinflar ( ), oqimlar (Stream API) effectively finalichida ishlatilishi mumkin .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
}
Endi kichik intervyu beraylik. Axir JavaRush kursini o'tashdan maqsad Java dasturchisi bo'lish va qiziqarli va yaxshi maoshli ishga joylashishdir. Shunday ekan, boshlaylik.
  1. Massiv e'lon qilinganda haqida nima deya olasiz final?

  2. Ma'lumki, sinf String, immutablesinf e'lon qilinadi , satrning qiymati kalit so'z bilan belgilangan finalmassivda saqlanadi .charfinal

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];
Ob'ektning qiymatini almashtirish mumkinmi String(ob'ektga havolani o'zgartirmasdan)? Bu haqiqiy intervyu savollari. Va amaliyot shuni ko'rsatadiki, ko'pchilik ularga noto'g'ri javob berishadi. Kalit so'zdan foydalanishni tushunish final, ayniqsa mos yozuvlar o'zgaruvchilari uchun juda muhimdir. Siz o'ylayotganingizda, JavaRush jamoasiga tez kirish. Iltimos, matn muharriringizga kontentni yashirish imkonini beruvchi blok qo‘shing va ustiga bosganingizda ushbu tarkibni ko‘rsating. Javoblar:
  1. Chunki massiv - ob'ekt, ya'ni finalob'ektga havola berilgandan so'ng, uni endi o'zgartirish mumkin emas, lekin ob'ekt holatini o'zgartirish mumkin.

    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. Ha mumkin. Asosiysi, tikanli so'zning ob'ektlar bilan ishlatilishini tushunishdir final. Qiymatni almashtirish uchun ReflectionAPI dan foydalanadi.

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
         */
    }
}
E'tibor bering, agar biz ibtidoiy turdagi oxirgi o'zgaruvchini shu tarzda o'zgartirishga harakat qilsak, hech narsa ishlamaydi. Men sizga o'zingizni bunga ishontirishni taklif qilaman: Java sinfini yarating, masalan, final intmaydon bilan va uning qiymatini Reflection API orqali o'zgartirishga harakat qiling. Hammaga omad!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION