JavaRush /جاوا بلاگ /Random-UR /تو حتمی...

تو حتمی...

گروپ میں شائع ہوا۔
جاوا میں ایک کلیدی لفظ ہے - final۔ اس کا اطلاق کلاسز، طریقوں، متغیرات (بشمول طریقہ کار کے دلائل) پر کیا جا سکتا ہے۔ تو حتمی... - 1ایک کلاس کے لیے، اس کا مطلب ہے کہ کلاس میں ذیلی طبقات نہیں ہو سکتے، یعنی وراثت ممنوع ہے۔ (غیر متغیر) اشیاء بناتے وقت یہ مفید ہے 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 کورس کرنے کا مقصد جاوا ڈویلپر بننا اور ایک دلچسپ اور اچھی تنخواہ والی نوکری حاصل کرنا ہے۔ تو، چلو شروع کرتے ہیں.
  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، خاص طور پر حوالہ متغیر کے لیے، بہت اہم ہے۔ جب آپ سوچ رہے ہوتے ہیں، جاوا رش ٹیم کی طرف فوری توجہ۔ براہ کرم اپنے ٹیکسٹ ایڈیٹر میں ایک بلاک شامل کریں جو آپ کو مواد کو چھپانے کی اجازت دیتا ہے، اور جب آپ اس پر کلک کریں تو یہ مواد دکھائیں۔ جوابات:
  1. کیونکہ 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