Java-da kalit so'z mavjud
final
. U sinflar, usullar, o'zgaruvchilar (jumladan, usul argumentlari) uchun qo'llanilishi mumkin. Sinf 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 String
sifatida 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
), final
chunki bular bir-birini inkor etuvchi tushunchalardir. Usul uchun final
uni 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. final
Boshqacha qilib aytganda, kompilyatsiya xatosisiz bunday o'zgaruvchiga so'zni almashtirishingiz mumkin . O'zgaruvchilar mahalliy sinflar ( ), anonim sinflar ( ), oqimlar (Stream API) effectively final
ichida ishlatilishi mumkin .Local Inner Classes
Anonymous 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.
-
Massiv e'lon qilinganda haqida nima deya olasiz
final
? -
Ma'lumki, sinf
String
,immutable
sinf e'lon qilinadi , satrning qiymati kalit so'z bilan belgilanganfinal
massivda saqlanadi .char
final
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:
-
Chunki massiv - ob'ekt, ya'ni
final
ob'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
-
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 int
maydon bilan va uning qiymatini Reflection API orqali o'zgartirishga harakat qiling. Hammaga omad!
GO TO FULL VERSION