java ۾ هڪ لفظ آهي -
final
. اهو طبقن، طريقن، متغيرن تي لاڳو ٿي سگھي ٿو (طريقو دليلن سميت). هڪ طبقي لاءِ، هن جو مطلب آهي ته ڪلاس ۾ ذيلي ڪلاس نه هوندا، يعني. وراثت ممنوع آهي. اهو ڪارائتو آهي جڏهن immutable
(غير بدليل) شيون ٺاهي، مثال طور هڪ طبقي 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");
}
}
ابتدائي قسم جي متغيرن لاءِ، ان جو مطلب آهي ته هڪ ڀيرو لڳايو ويو، قدر تبديل نه ٿي ڪري سگھجي. حوالن جي متغيرن لاءِ، هن جو مطلب آهي ته هڪ ڀيرو هڪ اعتراض لڳايو ويو آهي، ان اعتراض جو حوالو تبديل نٿو ڪري سگهجي. اهو ضروري آهي! لنڪ تبديل نه ٿي ڪري سگھجي، پر اعتراض جي حالت کي تبديل ڪري سگھجي ٿو. جاوا 8 سان تصور ظاهر ٿيو - effectively final
. اهو صرف متغيرن تي لاڳو ٿئي ٿو (طريقي دليلن سميت). نقطو اهو آهي ته لفظ جي واضح غير موجودگي جي باوجود final
، متغير جي قيمت شروعاتي ٿيڻ کان پوء تبديل نه ٿيندي آهي. ٻين لفظن ۾، توھان ھڪڙي لفظ کي متبادل ڪري سگھو ٿا اھڙي متغير لاءِ final
بغير تاليف جي غلطي. effectively final
متغير مقامي طبقن ( Local Inner Classes
)، گمنام طبقن ( Anonymous Inner Classes
)، اسٽريمز (اسٽريم 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 ڪورس وٺڻ جو مقصد هڪ جاوا ڊولپر ٿيڻ ۽ هڪ دلچسپ ۽ سٺي ادا ڪيل نوڪري حاصل ڪرڻ آهي. سو، اچو ته شروع ڪريون.
-
توهان ڇا چئي سگهو ٿا هڪ صف بابت جڏهن اهو اعلان ڪيو ويو آهي
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[];
ڇا اهو ممڪن آهي ته ڪنهن شئي جي قيمت کي تبديل ڪرڻ String
(بغير اعتراض جي حوالي سان)؟ اهي حقيقي انٽرويو سوال آهن. ۽ جيئن ته مشق ڏيکاري ٿو، ڪيترائي انهن کي غلط جواب ڏين ٿا. لفظ جي استعمال کي سمجھڻ final
، خاص طور تي حوالن جي متغيرن لاءِ، تمام ضروري آھي. جڏهن توهان سوچي رهيا آهيو، JavaRush ٽيم ڏانهن تڪڙو تڪڙو. مھرباني ڪري پنھنجي ٽيڪسٽ ايڊيٽر ۾ ھڪڙو بلاڪ شامل ڪريو جيڪو توھان کي مواد کي لڪائڻ جي اجازت ڏئي ٿو، ۽ جڏھن توھان ان تي ڪلڪ ڪريو، اھو مواد ڏيکاريو. جواب:
-
ڇاڪاڻ ته a array هڪ اعتراض آهي، جنهن
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
-
ها، توهان ڪري سگهو ٿا. اهم
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
*/
}
}
مهرباني ڪري نوٽ ڪريو ته جيڪڏهن اسان هن طريقي سان ابتدائي قسم جي آخري متغير کي تبديل ڪرڻ جي ڪوشش ڪئي، ڪجھ به ڪم نه ڪندو. مان توهان کي صلاح ڏيان ٿو ته توهان پاڻ کي هن تي قائل ڪريو: هڪ جاوا ڪلاس ٺاهيو، مثال طور، final int
فيلڊ سان ۽ ان جي قيمت تبديل ڪرڻ جي ڪوشش ڪريو Reflection API ذريعي. سڀني کي سٺي قسمت!
GO TO FULL VERSION