JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ تفويض ۽ شروعات
Viacheslav
سطح

جاوا ۾ تفويض ۽ شروعات

گروپ ۾ شايع ٿيل

تعارف

ڪمپيوٽر پروگرامن جو بنيادي مقصد ڊيٽا پروسيسنگ آهي. ڊيٽا کي پروسيس ڪرڻ لاء توهان کي ڪنهن به طريقي سان ذخيرو ڪرڻ جي ضرورت آهي. مان سمجهان ٿو ته ڊيٽا ڪيئن ذخيرو ٿيل آهي.
جاوا ۾ تفويض ۽ شروعات - 1

متغير

متغير اهي ڪنٽينر آهن جيڪي ڪنهن به ڊيٽا کي محفوظ ڪن ٿا. اچو ته ڏسون سرڪاري سبق Oracle کان: Declaring Member Variables . هن سبق جي مطابق، متغير جا ڪيترائي قسم آهن:
  • فيلڊ : ڪلاس ۾ بيان ڪيل متغير؛
  • مقامي variables : variables in a method or block of code ؛
  • پيرا ميٽرز : طريقي جي اعلان ۾ متغير (دستخط ۾).
سڀني متغيرن کي هڪ متغير قسم ۽ متغير جو نالو هجڻ گهرجي.
  • هڪ متغير جو قسم ظاهر ڪري ٿو ته ڪهڙي ڊيٽا کي متغير نمائندگي ڪري ٿو (اهو آهي، ڪهڙي ڊيٽا اهو ذخيرو ڪري سگهي ٿو). جيئن اسان ڄاڻون ٿا، هڪ متغير جو قسم ٿي سگهي ٿو primitive (primitives primitives ) يا اعتراض ، غير ابتدائي (Non-primitive). اعتراض متغير سان، انهن جو قسم هڪ مخصوص طبقي طرفان بيان ڪيو ويو آهي.
  • اُٺ جي صورت ۾، متغير جو نالو ننڍو هئڻ گهرجي. توھان وڌيڪ پڙھي سگھو ٿا نالو ڏيڻ بابت " متغير: نالو ڏيڻ " ۾.
انهي سان گڏ، جيڪڏهن هڪ طبقي سطح تي متغير، يعني. هڪ ڪلاس فيلڊ آهي، ان لاءِ هڪ رسائي موڊيفائر بيان ڪري سگهجي ٿو. وڌيڪ تفصيل لاءِ ڪلاس جي ميمبرن تائين رسائي ڪنٽرول ڪرڻ ڏسو .

متغير اعلان

تنهن ڪري، اسان کي ياد آهي ته متغير ڇا آهي. ھڪڙي متغير سان ڪم ڪرڻ شروع ڪرڻ لاء، توھان کي ان جو اعلان ڪرڻو پوندو. پهرين، اچو ته هڪ مقامي متغير کي ڏسو. IDE جي بدران، سهولت لاءِ، اسان استعمال ڪنداسين آن لائين حل مان tutorialspoint: آن لائن IDE . اچو ته هن سادي پروگرام کي انهن جي آن لائن IDE ۾ هلون:
public class HelloWorld{
    public static void main(String []args){
        int number;
        System.out.println(number);
    }
}
numberتنهن ڪري، جيئن توهان ڏسي سگهو ٿا، اسان نالو ۽ قسم سان مقامي متغير جو اعلان ڪيو آهي int. اسان "Execute" بٽڻ کي دٻايو ۽ غلطي حاصل ڪريو:
HelloWorld.java:5: error: variable number might not have been initialized
        System.out.println(number);
ڇا ٿيو؟ اسان هڪ متغير جو اعلان ڪيو، پر ان جي قيمت کي شروع نه ڪيو. اها ڳالهه نوٽ ڪرڻ جي قابل آهي ته هي غلطي عمل جي وقت ۾ نه آئي آهي (يعني، رن ٽائم ۾ نه)، پر تاليف جي وقت تي. سمارٽ ڪمپلر چيڪ ڪيو ته ڇا مقامي متغير ان تائين پهچڻ کان اڳ شروع ڪيو ويندو يا نه. تنهن ڪري، هن کان هيٺ ڏنل بيان آهن:
  • مقامي متغيرن کي صرف ان جي شروعات ٿيڻ کان پوءِ ئي رسائي حاصل ڪرڻ گھرجي؛
  • مقامي متغيرن ۾ ڊفالٽ قدر نه آھن؛
  • مقامي متغير جا قدر مرتب وقت تي چيڪ ڪيا ويا آهن.
تنهن ڪري، اسان کي ٻڌايو ويو آهي ته متغير کي شروعات ڪرڻ گهرجي. هڪ متغير کي شروع ڪرڻ هڪ متغير کي قيمت تفويض ڪري رهيو آهي. اچو ته پوء اهو ڄاڻون ته اهو ڇا آهي ۽ ڇو.

مقامي متغير جي شروعات

متغير کي شروع ڪرڻ جاوا ۾ سڀ کان مشڪل ترين عنوانن مان هڪ آهي، ڇاڪاڻ ته ... ميموري سان ڪم ڪرڻ سان تمام ويجھو لاڳاپيل آهي، JVM عمل درآمد، JVM وضاحتون ۽ ٻيون ساڳيون خوفناڪ ۽ مشڪل شيون. پر توهان ڪوشش ڪري سگهو ٿا گهٽ ۾ گهٽ ڪنهن حد تائين ان کي سمجهڻ جي. اچو ته سادي کان پيچيده ڏانهن وڃو. متغير کي شروع ڪرڻ لاء، اسان استعمال ڪنداسين اسائنمينٽ آپريٽر ۽ اسان جي پوئين ڪوڊ ۾ لائن تبديل ڪنداسين:
int number = 2;
هن اختيار ۾، ڪو به نقص نه ٿيندو ۽ قيمت اسڪرين تي ڏيکاري ويندي. هن معاملي ۾ ڇا ٿيندو؟ اچو ته دليل ڏيڻ جي ڪوشش ڪريون. جيڪڏهن اسان هڪ متغير کي قيمت ڏيڻ چاهيون ٿا، پوء اسان چاهيون ٿا ته متغير هڪ قيمت کي ذخيرو ڪرڻ لاء. اهو ظاهر ٿئي ٿو ته قيمت کي ڪٿي رکڻ گهرجي، پر ڪٿي؟ ڊسڪ تي؟ پر اهو تمام سست آهي ۽ اسان تي پابنديون لاڳو ڪري سگهي ٿي. اهو ظاهر ٿئي ٿو ته صرف هڪ جڳهه جتي اسان جلدي ۽ موثر طريقي سان ڊيٽا محفوظ ڪري سگهون ٿا "هتي ۽ هاڻي" ياداشت آهي. هن جو مطلب آهي ته اسان کي ياداشت ۾ ڪجهه جاء مختص ڪرڻ جي ضرورت آهي. هي سچ آهي. جڏهن هڪ متغير جي شروعات ڪئي ويندي آهي، ان لاءِ جاوا پروسيس کي مختص ڪيل ميموري ۾ ان لاءِ جاءِ مختص ڪئي ويندي جنهن ۾ اسان جو پروگرام عمل ڪيو ويندو. جاوا عمل کي مختص ڪيل ياداشت ڪيترن ئي علائقن يا زونن ۾ ورهايل آهي. انھن مان ڪھڙي جاءِ مختص ڪندو ان تي منحصر آھي ته ڪھڙي قسم جي متغير جو اعلان ڪيو ويو آھي. ميموري کي هيٺين حصن ۾ ورهايو ويو آهي: Heap، Stack ۽ Non-heap . اچو ته اسٽيڪ ميموري سان شروع ڪريون. اسٽيڪ کي اسٽيڪ طور ترجمو ڪيو ويو آهي (مثال طور، ڪتابن جو اسٽيڪ). اهو هڪ LIFO آهي (آخري اندر، پهريون ٻاهر) ڊيٽا جي جوڙجڪ. يعني ڪتابن جي ڍير وانگر. جڏهن اسان ان ۾ ڪتاب شامل ڪريون ٿا، اسان انهن کي مٿي تي رکون ٿا، ۽ جڏهن اسين انهن کي ڪڍون ٿا، اسان مٿي کڻون ٿا (يعني اهو جيڪو تازو شامل ڪيو ويو آهي). تنهن ڪري، اسان پنهنجو پروگرام شروع ڪيو. جيئن ته اسان ڄاڻون ٿا، هڪ جاوا پروگرام هڪ JVM پاران جاري ڪيو ويو آهي، اهو آهي، هڪ جاوا ورچوئل مشين. JVM کي ڄاڻڻ گهرجي ته پروگرام جي عمل کي ڪٿي شروع ڪرڻ گهرجي. هن کي ڪرڻ لاء، اسان هڪ مکيه طريقو بيان ڪريون ٿا، جنهن کي "داخلي نقطي" سڏيو ويندو آهي. JVM ۾ عمل ڪرڻ لاء، ھڪڙو مکيه موضوع (Thread) ٺاھيو ويو آھي. جڏهن هڪ ڌاڳو ٺاهيو ويندو آهي، ان کي ميموري ۾ پنهنجي اسٽيڪ مختص ڪيو ويندو آهي. هي اسٽيڪ فريم تي مشتمل آهي. جڏهن هر نئين طريقي کي هڪ سلسلي ۾ لڳايو ويندو آهي، هڪ نئون فريم ان لاء مختص ڪيو ويندو ۽ اسٽيڪ جي چوٽي تي شامل ڪيو ويندو (جهڙوڪ ڪتابن جي اسٽيڪ ۾ نئون ڪتاب). هن فريم ۾ شيون ۽ ابتدائي قسمن جا حوالا هوندا. ها، ها، اسان جو int اسٽيڪ تي محفوظ ڪيو ويندو، ڇاڪاڻ ته ... int هڪ ابتدائي قسم آهي. ھڪڙي فريم کي مختص ڪرڻ کان پھريان، JVM کي سمجھڻ گھرجي ته اتي ڇا بچايو وڃي. اهو ئي سبب آهي ته اسان کي غلطي ملي ويندي "متغير شايد شروعات نه ڪئي وئي آهي"، ڇاڪاڻ ته جيڪڏهن اهو شروع نه ڪيو ويو آهي، ته پوء JVM اسان لاء اسٽيڪ تيار ڪرڻ جي قابل نه هوندو. تنهن ڪري، جڏهن هڪ پروگرام گڏ ڪرڻ، هڪ سمارٽ ڪمپلر اسان کي غلطي ڪرڻ ۽ هر شيء کي ٽوڙڻ کان بچڻ ۾ مدد ڪندو. (!) وضاحت لاءِ، مان سفارش ڪريان ٿو هڪ سپر-دوپر آرٽيڪل: “ جاوا اسٽيڪ ۽ هيپ: جاوا ميموري مختص ڪرڻ وارو سبق ”. اهو هڪ جيتري سٺي وڊيو سان ڳنڍيل آهي:
هڪ طريقي جي عمل جي مڪمل ٿيڻ کان پوء، انهن طريقن لاء مختص ڪيل فريم کي ٿريڊ جي اسٽيڪ مان خارج ڪيو ويندو، ۽ ان سان گڏ هن فريم لاء مختص ڪيل ميموري کي سموري ڊيٽا سان صاف ڪيو ويندو.

مقامي آبجیکٹ متغيرن کي شروع ڪرڻ

اچو ته اسان جو ڪوڊ ٻيهر تبديل ڪريون ٿوري وڌيڪ مشڪل ۾:
public class HelloWorld{

    private int number = 2;

    public static void main(String []args){
        HelloWorld object = new HelloWorld();
        System.out.println(object.number);
    }

}
هتي ڇا ٿيندو؟ اچو ته ان بابت ٻيهر ڳالهايون. JVM ڄاڻي ٿو جتي ان کي پروگرام کي هلائڻ گهرجي، يعني. هوء بنيادي طريقو ڏسي ٿي. اهو هڪ ڌاڳو ٺاهي ٿو، ان لاءِ ميموري مختص ڪري ٿو (آخرڪار، هڪ سلسلي کي ضرورت آهي ڊيٽا کي ذخيرو ڪرڻ لاءِ ڪٿي ڪٿي عمل ڪرڻ لاءِ). ھن سلسلي ۾، ھڪڙي فريم کي بنيادي طريقي لاء مختص ڪيو ويو آھي. اڳيون اسان هڪ HelloWorld اعتراض ٺاهيندا آهيون. هي اعتراض هاڻي اسٽيڪ تي نه، پر ڍير تي ٺهيل آهي. ڇاڪاڻ ته اعتراض هڪ ابتدائي قسم نه آهي، پر هڪ اعتراض جو قسم. ۽ اسٽيڪ صرف ڍير ۾ اعتراض جي حوالي سان ذخيرو ڪندو (اسان کي ڪنهن به طرح هن اعتراض تائين رسائي ڪرڻ گهرجي). اڳيون، مکيه طريقي جي اسٽيڪ ۾، فريم مختص ڪيا ويندا println طريقي تي عمل ڪرڻ لاء. مکيه طريقي تي عمل ڪرڻ کان پوء، سڀئي فريم تباهه ٿي ويندا. جيڪڏهن فريم تباهه ٿي ويندو، سڀ ڊيٽا تباهه ٿي ويندا. اعتراض واري شيء کي فوري طور تي تباهه نه ڪيو ويندو. پهرين، ان جو حوالو تباهه ٿي ويندو ۽ اهڙيءَ طرح هاڻي ڪو به ماڻهو ان شئي جو حوالو نه ڏيندو ۽ ميموري ۾ ان شئي تائين رسائي ممڪن نه رهندي. هڪ سمارٽ JVM وٽ ان لاءِ پنهنجو ميکانيزم هوندو آهي - هڪ گاربيج ڪليڪٽر (گاربيج ڪليڪٽر يا مختصر لاءِ GC). اهو وري ميموري شين مان هٽائي ٿو ته ٻيو ڪو به حوالو ناهي. اهو عمل وري مٿي ڏنل لنڪ ۾ بيان ڪيو ويو آهي. وضاحت سان گڏ هڪ وڊيو پڻ آهي.

شروعاتي فيلڊز

ڪلاس ۾ بيان ڪيل فيلڊز جي شروعات هڪ خاص طريقي سان ٿيندي آهي ان تي منحصر آهي ته ڇا فيلڊ جامد آهي يا نه. جيڪڏهن هڪ فيلڊ ۾ لفظ جامد آهي، ته پوء هي فيلڊ پاڻ کي طبقي ڏانهن اشارو ڪري ٿو، ۽ جيڪڏهن لفظ جامد بيان نه ڪيو ويو آهي، ته پوء هي فيلڊ ڪلاس جي هڪ مثال ڏانهن اشارو ڪري ٿو. اچو ته ان کي هڪ مثال سان ڏسو:
public class HelloWorld{
    private int number;
    private static int count;

    public static void main(String []args){
        HelloWorld object = new HelloWorld();
        System.out.println(object.number);
    }
}
هن مثال ۾، فيلڊ مختلف وقتن تي شروع ڪيا ويا آهن. HelloWorld ڪلاس شئي ٺهڻ کان پوءِ نمبر فيلڊ کي شروع ڪيو ويندو. پر ڳڻپ جو ميدان شروع ڪيو ويندو جڏهن طبقو لوڊ ڪيو ويندو جاوا ورچوئل مشين ذريعي. ڪلاس لوڊ ڪرڻ هڪ الڳ موضوع آهي، تنهنڪري اسان ان کي هتي گڏ نه ڪنداسين. اهو صرف ڄاڻڻ جي قابل آهي ته جامد متغيرن جي شروعات ٿيندي آهي جڏهن ڪلاس رن ٽائم تي معلوم ٿئي ٿو. هتي ٻيو ڪجهه وڌيڪ اهم آهي، ۽ توهان اڳ ۾ ئي اهو محسوس ڪيو آهي. اسان ڪٿي به قيمت بيان نه ڪئي، پر اهو ڪم ڪري ٿو. ۽ بيشڪ. متغير جيڪي فيلڊ آهن، جيڪڏهن انهن وٽ ڪا قيمت مقرر نه آهي، اهي هڪ ڊفالٽ قيمت سان شروع ڪيا ويندا آهن. عددي قدرن لاءِ ھي آھي 0 يا 0.0 سچل پوائنٽ نمبرن لاءِ. بولين لاءِ هي غلط آهي. ۽ سڀ شئي جي قسم جي متغيرن لاءِ قدر null ٿي ويندي (اسان ان بابت بعد ۾ ڳالهائينداسين). لڳي ٿو، ائين ڇو آهي؟ پر ڇاڪاڻ ته شيون ٺھيل آھن Heap ۾ (ھپ ۾). هن علائقي سان ڪم Runtime ۾ ڪيو ويندو آهي. ۽ اسان انهن متغيرن کي رن ٽائم تي شروع ڪري سگھون ٿا، اسٽيڪ جي برعڪس، ميموري جنهن لاءِ تيار ٿيڻ کان اڳ لازمي آهي. اهڙي طرح جاوا ۾ ميموري ڪم ڪري ٿي. پر هتي هڪ وڌيڪ خاصيت آهي. هي ننڍڙو ٽڪرو ياداشت جي مختلف ڪنڊن کي ڇڪي ٿو. جيئن اسان کي ياد آهي، هڪ فريم مختص ڪيو ويو آهي اسٽيڪ ميموري ۾ مکيه طريقي لاء. هي فريم هيپ ميموري ۾ هڪ اعتراض جو حوالو محفوظ ڪري ٿو. پر پوءِ ڳڻپ ڪٿي رکيل آهي؟ جيئن اسان کي ياد آهي، هي متغير فوري طور تي شروع ڪيو ويو آهي، ان کان اڳ جو اعتراض ڍير ۾ پيدا ٿئي. هي هڪ واقعي مشڪل سوال آهي. جاوا 8 کان اڳ، PERMGEN نالي هڪ يادگار علائقو هو. جاوا 8 سان شروع ڪندي، هي علائقو تبديل ٿي چڪو آهي ۽ METASPACE سڏيو ويندو آهي. لازمي طور تي، جامد متغير طبقن جي تعريف جو حصو آهن، يعني. ان جي ميٽا ڊيٽا. تنهن ڪري، اهو منطقي آهي ته اهو ميٽاداٽ مخزن ۾ ذخيرو ٿيل آهي، METASPACE. MetaSpace ساڳئي غير هيپ ياداشت واري علائقي سان تعلق رکي ٿو ۽ ان جو حصو آهي. اهو پڻ غور ۾ رکڻ ضروري آهي ته ترتيب جنهن ۾ متغير جو اعلان ڪيو ويو آهي حساب ۾ ورتو وڃي. مثال طور، هن ڪوڊ ۾ هڪ غلطي آهي:
public class HelloWorld{

    private static int b = a;
    private static int a = 1;

    public static void main(String []args){
        System.out.println(b);
    }

}

null ڇا آهي

جيئن مٿي بيان ڪيو ويو آهي، اعتراض جي قسمن جا متغير، جيڪڏهن اهي هڪ طبقي جا شعبا آهن، شروعاتي قدرن کي ڊفالٽ ويلز تي شروع ڪيو ويو آهي ۽ اهو ڊفالٽ قدر null آهي. پر جاوا ۾ null ڇا آهي؟ ياد رکڻ لاءِ پهرين شيءِ اها آهي ته ابتدائي قسمون خالي نٿا ٿي سگهن. ۽ سڀ ڇاڪاڻ ته null هڪ خاص حوالو آهي جيڪو ڪٿي به، ڪنهن به شئي ڏانهن اشارو نٿو ڪري. تنهن ڪري، صرف هڪ اعتراض variable null ٿي سگهي ٿو. ٻي ڳالھ جيڪا سمجھڻ لاءِ اھم آھي ته null ھڪڙو حوالو آھي. منهنجو حوالو به انهن جو وزن آهي. هن موضوع تي، توهان stackoverflow تي سوال پڙهي سگهو ٿا: " ڇا null variable ميموري ۾ جاء جي ضرورت آهي ".

شروعاتي بلاڪ

جڏهن متغير جي شروعات تي غور ڪيو وڃي، اهو هڪ گناهه هوندو ته شروعاتي بلاڪ تي غور نه ڪيو وڃي. اهو هن طرح نظر اچي ٿو:
public class HelloWorld{

    static {
        System.out.println("static block");
    }

    {
        System.out.println("block");
    }

    public HelloWorld () {
        System.out.println("Constructor");
    }

    public static void main(String []args){
        HelloWorld obj = new HelloWorld();
    }

}
ٻاھرين آرڊر ٿيندو: جامد بلاڪ، بلاڪ، ٺاھيندڙ. جيئن اسان ڏسي سگهون ٿا، شروعاتي بلاڪ تعمير ڪندڙ کان اڳ جاري ڪيا ويا آهن. ۽ ڪڏهن ڪڏهن اهو ٿي سگهي ٿو شروعات جو هڪ آسان ذريعو.

نتيجو

مون کي اميد آهي ته هي مختصر جائزو ڪجهه بصيرت مهيا ڪرڻ جي قابل ٿي چڪو آهي ته اهو ڪيئن ڪم ڪري ٿو ۽ ڇو. #وياچسلاو
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION