Дар java калимаи калидӣ мавҷуд аст -
final
. Он метавонад ба синфҳо, усулҳо, тағирёбандаҳо (аз ҷумла далелҳои методӣ) татбиқ карда шавад. Барои синф ин маънои онро дорад, ки синф наметавонад зерсинфҳо дошта бошад, яъне. Мерос манъ аст. Ин ҳангоми сохтани immutable
an 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 шудан ва ба даст овардани кори ҷолиб ва музднок аст. Пас, биёед оғоз кунем.
-
Ҳангоми эълон кардани массив шумо дар бораи он чӣ гуфта метавонед
final
? -
Маълум аст , ки синф
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. Лутфан дар муҳаррири матнии худ блоке илова кунед, ки ба шумо имкон медиҳад мундариҷаро пинҳон кунед ва вақте ки шумо онро пахш мекунед, ин мундариҷаро нишон диҳед. Ҷавобҳо:
-
Зеро массив 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
-
Бале, шумо метавонед. Муҳим он аст, ки фаҳмидани истифодаи калимаи чӯбкорӣ
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 тағир диҳед. Барори кор ба ҳама!
GO TO FULL VERSION