ڪمپيوٽر پروگرامن جو بنيادي مقصد ڊيٽا پروسيسنگ آهي. ڊيٽا کي پروسيس ڪرڻ لاء توهان کي ڪنهن به طريقي سان ذخيرو ڪرڻ جي ضرورت آهي. مان سمجهان ٿو ته ڊيٽا ڪيئن ذخيرو ٿيل آهي.
متغير
متغير اهي ڪنٽينر آهن جيڪي ڪنهن به ڊيٽا کي محفوظ ڪن ٿا. اچو ته ڏسون سرڪاري سبق Oracle کان: Declaring Member Variables . هن سبق جي مطابق، متغير جا ڪيترائي قسم آهن:
فيلڊ : ڪلاس ۾ بيان ڪيل متغير؛
مقامي variables : variables in a method or block of code ؛
پيرا ميٽرز : طريقي جي اعلان ۾ متغير (دستخط ۾).
سڀني متغيرن کي هڪ متغير قسم ۽ متغير جو نالو هجڻ گهرجي.
هڪ متغير جو قسم ظاهر ڪري ٿو ته ڪهڙي ڊيٽا کي متغير نمائندگي ڪري ٿو (اهو آهي، ڪهڙي ڊيٽا اهو ذخيرو ڪري سگهي ٿو). جيئن اسان ڄاڻون ٿا، هڪ متغير جو قسم ٿي سگهي ٿو primitive (primitives primitives ) يا اعتراض ، غير ابتدائي (Non-primitive). اعتراض متغير سان، انهن جو قسم هڪ مخصوص طبقي طرفان بيان ڪيو ويو آهي.
اُٺ جي صورت ۾، متغير جو نالو ننڍو هئڻ گهرجي. توھان وڌيڪ پڙھي سگھو ٿا نالو ڏيڻ بابت " متغير: نالو ڏيڻ " ۾.
تنهن ڪري، اسان کي ياد آهي ته متغير ڇا آهي. ھڪڙي متغير سان ڪم ڪرڻ شروع ڪرڻ لاء، توھان کي ان جو اعلان ڪرڻو پوندو. پهرين، اچو ته هڪ مقامي متغير کي ڏسو. IDE جي بدران، سهولت لاءِ، اسان استعمال ڪنداسين آن لائين حل مان tutorialspoint: آن لائن IDE . اچو ته هن سادي پروگرام کي انهن جي آن لائن IDE ۾ هلون:
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 اسان لاء اسٽيڪ تيار ڪرڻ جي قابل نه هوندو. تنهن ڪري، جڏهن هڪ پروگرام گڏ ڪرڻ، هڪ سمارٽ ڪمپلر اسان کي غلطي ڪرڻ ۽ هر شيء کي ٽوڙڻ کان بچڻ ۾ مدد ڪندو. (!) وضاحت لاءِ، مان سفارش ڪريان ٿو هڪ سپر-دوپر آرٽيڪل: “ جاوا اسٽيڪ ۽ هيپ: جاوا ميموري مختص ڪرڻ وارو سبق ”. اهو هڪ جيتري سٺي وڊيو سان ڳنڍيل آهي:
هڪ طريقي جي عمل جي مڪمل ٿيڻ کان پوء، انهن طريقن لاء مختص ڪيل فريم کي ٿريڊ جي اسٽيڪ مان خارج ڪيو ويندو، ۽ ان سان گڏ هن فريم لاء مختص ڪيل ميموري کي سموري ڊيٽا سان صاف ڪيو ويندو.
publicclassHelloWorld{privateint number =2;publicstaticvoidmain(String[]args){HelloWorld object =newHelloWorld();System.out.println(object.number);}}
هتي ڇا ٿيندو؟ اچو ته ان بابت ٻيهر ڳالهايون. JVM ڄاڻي ٿو جتي ان کي پروگرام کي هلائڻ گهرجي، يعني. هوء بنيادي طريقو ڏسي ٿي. اهو هڪ ڌاڳو ٺاهي ٿو، ان لاءِ ميموري مختص ڪري ٿو (آخرڪار، هڪ سلسلي کي ضرورت آهي ڊيٽا کي ذخيرو ڪرڻ لاءِ ڪٿي ڪٿي عمل ڪرڻ لاءِ). ھن سلسلي ۾، ھڪڙي فريم کي بنيادي طريقي لاء مختص ڪيو ويو آھي. اڳيون اسان هڪ HelloWorld اعتراض ٺاهيندا آهيون. هي اعتراض هاڻي اسٽيڪ تي نه، پر ڍير تي ٺهيل آهي. ڇاڪاڻ ته اعتراض هڪ ابتدائي قسم نه آهي، پر هڪ اعتراض جو قسم. ۽ اسٽيڪ صرف ڍير ۾ اعتراض جي حوالي سان ذخيرو ڪندو (اسان کي ڪنهن به طرح هن اعتراض تائين رسائي ڪرڻ گهرجي). اڳيون، مکيه طريقي جي اسٽيڪ ۾، فريم مختص ڪيا ويندا println طريقي تي عمل ڪرڻ لاء. مکيه طريقي تي عمل ڪرڻ کان پوء، سڀئي فريم تباهه ٿي ويندا. جيڪڏهن فريم تباهه ٿي ويندو، سڀ ڊيٽا تباهه ٿي ويندا. اعتراض واري شيء کي فوري طور تي تباهه نه ڪيو ويندو. پهرين، ان جو حوالو تباهه ٿي ويندو ۽ اهڙيءَ طرح هاڻي ڪو به ماڻهو ان شئي جو حوالو نه ڏيندو ۽ ميموري ۾ ان شئي تائين رسائي ممڪن نه رهندي. هڪ سمارٽ JVM وٽ ان لاءِ پنهنجو ميکانيزم هوندو آهي - هڪ گاربيج ڪليڪٽر (گاربيج ڪليڪٽر يا مختصر لاءِ GC). اهو وري ميموري شين مان هٽائي ٿو ته ٻيو ڪو به حوالو ناهي. اهو عمل وري مٿي ڏنل لنڪ ۾ بيان ڪيو ويو آهي. وضاحت سان گڏ هڪ وڊيو پڻ آهي.
شروعاتي فيلڊز
ڪلاس ۾ بيان ڪيل فيلڊز جي شروعات هڪ خاص طريقي سان ٿيندي آهي ان تي منحصر آهي ته ڇا فيلڊ جامد آهي يا نه. جيڪڏهن هڪ فيلڊ ۾ لفظ جامد آهي، ته پوء هي فيلڊ پاڻ کي طبقي ڏانهن اشارو ڪري ٿو، ۽ جيڪڏهن لفظ جامد بيان نه ڪيو ويو آهي، ته پوء هي فيلڊ ڪلاس جي هڪ مثال ڏانهن اشارو ڪري ٿو. اچو ته ان کي هڪ مثال سان ڏسو:
GO TO FULL VERSION