JavaRush /جاوا بلاگ /Random-SD /پوءِ حتمي...

پوءِ حتمي...

گروپ ۾ شايع ٿيل
java ۾ هڪ لفظ آهي - final. اهو طبقن، طريقن، متغيرن تي لاڳو ٿي سگھي ٿو (طريقو دليلن سميت). پوءِ حتمي... - 1هڪ طبقي لاءِ، هن جو مطلب آهي ته ڪلاس ۾ ذيلي ڪلاس نه هوندا، يعني. وراثت ممنوع آهي. اهو ڪارائتو آهي جڏهن immutable(غير بدليل) شيون ٺاهي، مثال طور هڪ طبقي Stringجو اعلان ڪيو ويو آهي final.
public final class String{
}

class SubString extends String{ //Compilation error
}
اهو پڻ ياد رکڻ گهرجي ته ترميم ڪندڙ تجريدي طبقن تي لاڳو نه ٿو ڪري سگهجي (ڪي لفظ سان abstractfinalڇاڪاڻ ته اهي گڏيل طور تي خاص تصور آهن. هڪ طريقو لاء 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 ڪورس وٺڻ جو مقصد هڪ جاوا ڊولپر ٿيڻ ۽ هڪ دلچسپ ۽ سٺي ادا ڪيل نوڪري حاصل ڪرڻ آهي. سو، اچو ته شروع ڪريون.
  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[];
ڇا اهو ممڪن آهي ته ڪنهن شئي جي قيمت کي تبديل ڪرڻ String(بغير اعتراض جي حوالي سان)؟ اهي حقيقي انٽرويو سوال آهن. ۽ جيئن ته مشق ڏيکاري ٿو، ڪيترائي انهن کي غلط جواب ڏين ٿا. لفظ جي استعمال کي سمجھڻ final، خاص طور تي حوالن جي متغيرن لاءِ، تمام ضروري آھي. جڏهن توهان سوچي رهيا آهيو، JavaRush ٽيم ڏانهن تڪڙو تڪڙو. مھرباني ڪري پنھنجي ٽيڪسٽ ايڊيٽر ۾ ھڪڙو بلاڪ شامل ڪريو جيڪو توھان کي مواد کي لڪائڻ جي اجازت ڏئي ٿو، ۽ جڏھن توھان ان تي ڪلڪ ڪريو، اھو مواد ڏيکاريو. جواب:
  1. ڇاڪاڻ ته 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
  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
         */
    }
}
مهرباني ڪري نوٽ ڪريو ته جيڪڏهن اسان هن طريقي سان ابتدائي قسم جي آخري متغير کي تبديل ڪرڻ جي ڪوشش ڪئي، ڪجھ به ڪم نه ڪندو. مان توهان کي صلاح ڏيان ٿو ته توهان پاڻ کي هن تي قائل ڪريو: هڪ جاوا ڪلاس ٺاهيو، مثال طور، final intفيلڊ سان ۽ ان جي قيمت تبديل ڪرڻ جي ڪوشش ڪريو Reflection API ذريعي. سڀني کي سٺي قسمت!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION