JavaRush /جاوا بلاگ /Random-UR /جاوا کور۔ انٹرویو کے لیے سوالات، حصہ 3
Vadim625
سطح

جاوا کور۔ انٹرویو کے لیے سوالات، حصہ 3

گروپ میں شائع ہوا۔
پچھلے دو مضامین میں، ہم نے کچھ اہم سوالات پر بات کی تھی جو آپ سے اکثر انٹرویوز میں پوچھے جاتے ہیں۔ اب وقت آگیا ہے کہ آگے بڑھیں اور باقی سوالات کو دیکھیں۔
جاوا کور۔  انٹرویو کے سوالات، حصہ 3 - 1

گہری نقل اور اتلی نقل

اصل کی ایک عین مطابق کاپی اس کا کلون ہے۔ جاوا میں، اس کا مطلب یہ ہے کہ اصل آبجیکٹ سے ملتی جلتی ساخت کے ساتھ ایک آبجیکٹ بنانے کے قابل ہونا۔ طریقہ clone()یہ فعالیت فراہم کرتا ہے۔ ممکن حد تک کم معلومات کی کاپیوں کی اتلی کاپی کریں۔ پہلے سے طے شدہ طور پر، جاوا میں کلوننگ کم ہوتی ہے، یعنی Object classکلاس کی ساخت کے بارے میں نہیں جانتا کہ یہ کاپی کر رہا ہے۔ کلوننگ کرتے وقت، JVM مندرجہ ذیل کام کرتا ہے:
  1. اگر کسی کلاس میں صرف پرائمیٹو اقسام کے ممبر ہوں تو آبجیکٹ کی مکمل طور پر نئی کاپی بنائی جائے گی اور اس آبجیکٹ کا حوالہ واپس کر دیا جائے گا۔
  2. اگر کسی کلاس میں نہ صرف قدیم قسم کے ممبران ہوں بلکہ کسی دوسری کلاس قسم کے ممبران بھی ہوں تو ان کلاسوں کی اشیاء کے حوالے نقل کیے جاتے ہیں۔ لہذا، دونوں اشیاء کے ایک ہی حوالے ہوں گے۔
گہری کاپی ہر چیز کو نقل کرتی ہے۔ گہری کاپی دو مجموعے ہیں، جن میں سے ایک اصل مجموعہ کے تمام عناصر کی نقل کرتا ہے۔ ہم ایک کاپی اس طرح بنانا چاہتے ہیں کہ کاپی کے کسی بھی عنصر میں تبدیلی کرنے سے اصل مجموعہ متاثر نہ ہو۔ گہری کلوننگ کے لیے درج ذیل اصولوں کی ضرورت ہوتی ہے۔
  1. قدیم ڈیٹا کو الگ سے کاپی کرنے کی ضرورت نہیں ہے۔
  2. اصل کلاس میں تمام ممبر کلاسز کو کلوننگ کی حمایت کرنی چاہیے۔ ہر کلاس ممبر کے لیے، super.clone()جب طریقہ اوور رائیڈ ہو جائے تو کال کرنا ضروری ہے clone()۔
  3. اگر کسی کلاس کا کوئی ممبر کلوننگ کی حمایت نہیں کرتا ہے، تو کلون کے طریقہ کار میں، آپ کو اس کلاس کی ایک نئی مثال بنانے کی ضرورت ہے اور اس کے ہر ممبر کو تمام صفات کے ساتھ نئے کلاس آبجیکٹ میں کاپی کرنا ہوگا، ایک وقت میں ایک۔
یہاں کلوننگ کے بارے میں مزید معلومات حاصل کریں۔

مطابقت پذیری کیا ہے؟ آبجیکٹ لیول لاکنگ اور کلاس لیول لاکنگ؟

مطابقت پذیری سے مراد ملٹی تھریڈنگ ہے۔ کوڈ کے ایک مطابقت پذیر بلاک کو ایک وقت میں صرف ایک تھریڈ کے ذریعے عمل میں لایا جا سکتا ہے۔ جاوا آپ کو ایک ساتھ متعدد تھریڈز پر کارروائی کرنے کی اجازت دیتا ہے۔ اس کے نتیجے میں دو یا زیادہ تھریڈز ایک ہی فیلڈ تک رسائی حاصل کرنا چاہتے ہیں۔ مطابقت پذیری میموری کی غلطیوں سے بچنے میں مدد کرتی ہے جو اس وقت ہوتی ہے جب میموری کے وسائل کو غلط طریقے سے استعمال کیا جاتا ہے۔ جب کسی طریقہ کو مطابقت پذیر قرار دیا جاتا ہے، تو تھریڈ اپنا مانیٹر رکھتا ہے۔ اگر اس وقت کوئی دوسرا دھاگہ مطابقت پذیر طریقہ تک رسائی حاصل کرنے کی کوشش کرتا ہے، تو تھریڈ بلاک ہوجاتا ہے اور مانیٹر کے آزاد ہونے کا انتظار کرتا ہے۔ جاوا میں مطابقت پذیری خصوصی مطابقت پذیر مطلوبہ الفاظ کے ساتھ مکمل کی جاتی ہے ۔ آپ اپنی کلاس میں انفرادی بلاکس یا طریقوں کو اس طرح نشان زد کر سکتے ہیں۔ مطابقت پذیر مطلوبہ الفاظ کو کلاس متغیرات یا صفات کے ساتھ استعمال نہیں کیا جا سکتا۔ آبجیکٹ لیول لاکنگ ایک طریقہ کار ہے جب آپ کسی غیر جامد طریقہ یا کوڈ کے غیر جامد بلاک کو ہم آہنگ کرنا چاہتے ہیں تاکہ کلاس کی دی گئی مثال پر صرف ایک تھریڈ کوڈ کے بلاک پر عمل درآمد کر سکے۔ کلاس مثال کے دھاگے کو محفوظ بنانے کے لیے یہ ہمیشہ کیا جانا چاہیے۔ کلاس لیول لاکنگ ایک سے زیادہ تھریڈز کو کلاس کی تمام دستیاب مثالوں کے لیے ہم وقت ساز بلاک میں داخل ہونے سے روکتی ہے۔ مثال کے طور پر، اگر DemoClass کلاس کی 100 مثالیں ہیں، تو صرف 1 تھریڈ ایک مقررہ وقت میں متغیرات میں سے ایک کا استعمال کرتے ہوئے demoMethod() پر عمل درآمد کر سکے گا۔ یہ ہمیشہ جامد دھاگے کی حفاظت کو یقینی بنانے کے لیے کیا جانا چاہیے۔ ہم وقت سازی کے بارے میں یہاں مزید جانیں۔

نیند () اور انتظار () میں کیا فرق ہے؟

Sleep()ایک طریقہ ہے جو عمل کو چند سیکنڈ کے لیے موخر کرنے کے لیے استعمال کیا جاتا ہے۔ کی صورت میں wait()، تھریڈ انتظار کی حالت میں ہے جب تک کہ ہم notify()یا طریقہ کو کال نہیں کرتے notifyAll()۔ بنیادی فرق یہ ہے کہ wait()یہ مانیٹر لاک کو جاری کرتا ہے جبکہ یہ sleep()لاک کو جاری نہیں کرتا ہے۔ Wait()ملٹی تھریڈڈ ایپلیکیشنز کے لیے استعمال کیا جاتا ہے، sleep()صرف تھریڈ پر عمل کو روکنے کے لیے استعمال کیا جاتا ہے۔ Thread.sleep()موجودہ دھاگے کو ایک خاص وقت کے لیے "Not Runnable" حالت میں رکھتا ہے۔ تھریڈ مانیٹر کی اس حالت کو بچاتا ہے جو اس طریقہ کو بلائے جانے سے پہلے تھی۔ اگر کوئی اور دھاگہ کال کرتا ہے t.interrupt()تو وہ دھاگہ جو "سو گیا تھا" جاگ جائے گا۔ نوٹ کریں کہ یہ sleep()ایک جامد طریقہ ہے، مطلب یہ ہے کہ یہ ہمیشہ موجودہ تھریڈ کو متاثر کرتا ہے (وہ طریقہ جو اس پر عمل کرتا ہے sleep())۔ ایک عام غلطی یہ ہے کہ دوسرا دھاگہ t.sleep()کہاں ہے کال کرنا ہے ۔ tیہاں تک کہ جب موجودہ تھریڈ جس نے طریقہ کہا ہے وہ تھریڈ sleep()نہیں ہے ۔ موجودہ دھاگے کو تھوڑی دیر کے لیے "Not Runnable" حالت میں بھیجتا ہے، بالکل اسی طرح ، لیکن کچھ باریکیوں کے ساتھ۔ کسی چیز پر بلایا جاتا ہے، دھاگے پر نہیں۔ ہم اس چیز کو "لاک آبجیکٹ" کہتے ہیں۔ کال کرنے سے پہلے ، موجودہ تھریڈ کو "لاک آبجیکٹ" کے ساتھ ہم آہنگ ہونا چاہیے۔ اس کے بعد، یہ اس تالا کو جاری کرتا ہے، اور اس تالے سے وابستہ "انتظار کی فہرست" میں تھریڈ کو شامل کرتا ہے۔ بعد میں، ایک اور تھریڈ اسی لاک آبجیکٹ کے ساتھ ہم آہنگ ہو سکتا ہے اور کال کر سکتا ہے ۔ یہ طریقہ اصل تھریڈ کو "جاگ" دے گا، جس کا ابھی تک انتظار ہے۔ اصولی طور پر، / کا موازنہ / سے کیا جا سکتا ہے، صرف ایکٹو تھریڈ کو سلیپنگ تھریڈ کے لیے براہ راست پوائنٹر کی ضرورت نہیں ہوتی، اسے صرف مشترکہ لاک آبجیکٹ کو جاننے کی ضرورت ہوتی ہے۔ تفصیلی فرق یہاں پڑھیں۔tObject.wait()sleep()Wait()lock.wait()wait()lock.notify()wait()notify()sleep()interrupt()

کیا حوالہ متغیر کو اس کے لیے null تفویض کرنا ممکن ہے؟

نہیں تم نہیں کر سکتے. جاوا میں، اسائنمنٹ آپریٹر کا بائیں جانب متغیر ہونا چاہیے۔ "یہ" ایک خاص کلیدی لفظ ہے جو ہمیشہ کلاس کی موجودہ مثال دیتا ہے۔ یہ صرف کوئی متغیر نہیں ہے۔ اسی طرح، "سپر" کلیدی لفظ یا اس سے ملتا جلتا کوئی دوسرا مطلوبہ لفظ استعمال کرتے ہوئے null کو متغیر کو تفویض نہیں کیا جاسکتا۔

&& اور & کے درمیان کیا فرق ہے؟

&- bitwise اور &&- منطقی طور پر۔
  1. &آپریشن کے دونوں اطراف کا اندازہ لگاتا ہے؛
  2. &&آپریشن کے بائیں جانب کا اندازہ لگاتا ہے۔ اگر درست ہے تو، یہ دائیں طرف کا جائزہ لینا جاری رکھتا ہے۔
گہری تفہیم کے لیے یہاں دیکھیں۔

Equals() اور hachCode() طریقوں کو کیسے اوور رائڈ کیا جائے؟

hashCode()اور equals()طریقوں کی تعریف کلاس میں کی گئی ہے Object، جو جاوا آبجیکٹ کے لیے پیرنٹ کلاس ہے۔ اس وجہ سے، تمام جاوا آبجیکٹ طریقوں کے لیے پہلے سے طے شدہ نفاذ کے وارث ہیں۔ طریقہ hashCode()کسی دیے گئے شے کے لیے ایک منفرد عدد حاصل کرنے کے لیے استعمال کیا جاتا ہے۔ اس عدد کو کسی شے کے مقام کا تعین کرنے کے لیے استعمال کیا جاتا ہے جب اس چیز کو ذخیرہ کرنے کی ضرورت ہوتی ہے، مثال کے طور پر HashTable۔ پہلے سے طے شدہ طور پر، میموری کے مقام کے پتے کی نمائندگی hashCode()کرتا ہے جہاں آبجیکٹ کو محفوظ کیا جاتا ہے۔ integerطریقہ equls()، جیسا کہ اس کے نام سے پتہ چلتا ہے، صرف یہ جانچنے کے لیے استعمال کیا جاتا ہے کہ آیا دو اشیاء برابر ہیں۔ پہلے سے طے شدہ نفاذ آبجیکٹ کے حوالہ جات کی جانچ کرتا ہے کہ آیا وہ برابر ہیں۔ ان طریقوں کو دوبارہ لوڈ کرنے کے لیے ذیل میں اہم رہنما اصول ہیں:
  1. تخلیق کرتے وقت ہمیشہ وہی آبجیکٹ اوصاف استعمال کریں hashCode()اور equals();
  2. ہم آہنگی وہ. xاگر یہ کچھ اشیاء کے لیے صحیح لوٹتا ہے y x.equals(y)، تو اسے y.equals(x)صحیح لوٹنا چاہیے۔
  3. اضطراری صلاحیت۔ کسی بھی شے کے لیے x x.equals(x)سچا ہونا ضروری ہے۔
  4. مستقل مزاجی. کسی بھی چیز کے لیے xاور y x.equals(y)ایک ہی چیز کو لوٹاتا ہے اگر موازنہ میں استعمال ہونے والی معلومات تبدیل نہیں ہوتی ہیں۔
  5. منتقلی کسی بھی آبجیکٹ کے لیے x، yاور z، اگر x.equals(y)یہ صحیح لوٹتا ہے اور y.equals(z)صحیح لوٹتا ہے، تو اسے x.equals(z)صحیح لوٹنا چاہیے۔
  6. جب بھی ایپلیکیشن کے عمل کے دوران ایک ہی شے پر کسی طریقہ کو کال کیا جاتا ہے، تو اسے وہی نمبر واپس کرنا چاہیے جب تک کہ استعمال شدہ معلومات تبدیل نہ ہوں۔ hashCodeمختلف ایپلی کیشنز میں ایک جیسی اشیاء کے لیے مختلف اقدار واپس کر سکتے ہیں؛
  7. اگر دو اشیاء برابر ہیں، کے مطابق equals، تو ان کو hashCodeایک جیسی اقدار واپس کرنی ہوں گی۔
  8. مخالف ضرورت اختیاری ہے۔ دو غیر مساوی اشیاء ایک ہی ہیش کوڈ کو واپس کر سکتی ہیں۔ تاہم، کارکردگی کو بہتر بنانے کے لیے، یہ بہتر ہے کہ مختلف اشیاء مختلف کوڈز واپس کریں۔
ان طریقوں کے بارے میں دلچسپ حقائق یہاں پڑھیں۔

رسائی میں ترمیم کرنے والوں کے بارے میں ہمیں بتائیں

جاوا کلاسز، فیلڈز، کنسٹرکٹرز، اور طریقوں میں چار مختلف رسائی ترمیم کاروں میں سے ایک ہو سکتا ہے: نجی اگر کسی طریقہ یا متغیر کو نجی کا نشان لگایا گیا ہے ، تو صرف اسی کلاس کے اندر موجود کوڈ متغیر تک رسائی حاصل کر سکتا ہے، یا طریقہ کو کال کر سکتا ہے۔ ذیلی طبقات کے اندر کا کوڈ متغیر یا طریقہ تک رسائی حاصل نہیں کر سکتا، اور نہ ہی کسی دوسری کلاس سے اس تک رسائی حاصل کر سکتا ہے۔ نجی رسائی موڈیفائر اکثر کنسٹرکٹرز، طریقوں اور متغیرات کے لیے استعمال ہوتا ہے۔ ڈیفالٹ پہلے سے طے شدہ رسائی موڈیفائر کا اعلان کیا جاتا ہے اگر ترمیم کنندہ بالکل بھی متعین نہ ہو۔ اس موڈیفائر کا مطلب ہے کہ کسی مخصوص کلاس کے فیلڈز، کنسٹرکٹرز اور طریقوں تک رسائی خود کلاس کے اندر کوڈ کے ذریعے، اسی پیکیج میں کلاسوں کے اندر کوڈ کے ذریعے حاصل کی جاسکتی ہے۔ ذیلی طبقات سپرکلاس کے طریقوں اور ممبر متغیرات تک رسائی حاصل نہیں کر سکتے ہیں اگر انہیں بطور ڈیفالٹ قرار دیا جاتا ہے ، جب تک کہ ذیلی طبقے سپر کلاس کے ہی پیکیج میں نہ ہوں۔ محفوظ شدہ موڈیفائر ڈیفالٹ کی طرح کام کرتا ہے ، سوائے اس کے کہ ذیلی طبقات سپر کلاس کے محفوظ طریقوں اور متغیرات تک بھی رسائی حاصل کر سکتے ہیں۔ یہ بیان درست ہے یہاں تک کہ اگر ذیلی طبقے سپرکلاس جیسے پیکیج میں نہ ہو۔ عوامی عوامی رسائی موڈیفائر کا مطلب ہے کہ تمام کوڈ کلاس، اس کے متغیرات، کنسٹرکٹرز یا طریقوں تک رسائی حاصل کر سکتے ہیں، قطع نظر اس کے کہ وہ کوڈ کہاں ہے۔ جاوا کور۔  انٹرویو کے لیے سوالات، حصہ 3 - 2

کچرا جمع کرنے والا کیا ہے؟ کیا ہم اسے بلا سکتے ہیں؟

کوڑا جمع کرنا بہت سی جدید پروگرامنگ زبانوں میں خودکار میموری مینجمنٹ کی ایک خصوصیت ہے، جیسے جاوا اور NET.Framework میں زبانیں۔ وہ زبانیں جو کوڑے کو جمع کرنے کا استعمال کرتی ہیں اکثر کوڑے کو جمع کرنے کی تشریح ورچوئل مشین جیسے JVM میں کرتی ہیں۔ کوڑا اٹھانے کے دو مقاصد ہیں: کسی بھی غیر استعمال شدہ میموری کو آزاد کیا جانا چاہئے، اور اگر پروگرام اب بھی اسے استعمال کرتا ہے تو میموری کو آزاد نہیں کیا جانا چاہئے۔ کیا آپ کوڑا اٹھانا دستی طور پر چلا سکتے ہیں؟ نہیں، System.gc()یہ آپ کو زیادہ سے زیادہ رسائی فراہم کرتا ہے۔ بہترین آپشن طریقہ کو کال کرنا ہے System.gc()، جو کوڑا اٹھانے والے کو اشارہ کرے گا کہ اسے چلانے کی ضرورت ہے۔ اسے فوری طور پر چلانے کا کوئی طریقہ نہیں ہے کیونکہ کوڑا اٹھانے والا غیر مقررہ ہے۔ مزید برآں، دستاویزات کے مطابق، OutOfMemoryErrorاگر ورچوئل مشین مکمل کوڑا کرکٹ جمع کرنے کے بعد میموری کو آزاد کرنے میں ناکام ہو جاتی ہے تو اسے آگے نہیں بڑھایا جائے گا۔ کوڑا اٹھانے والے کے بارے میں یہاں مزید جانیں۔

مقامی کلیدی لفظ کا کیا مطلب ہے؟ تفصیل سے بتائیں

مقامی کلیدی لفظ اس بات کی نشاندہی کرنے کے لیے استعمال کیا جاتا ہے کہ طریقہ جاوا فائل کے علاوہ کسی پروگرامنگ زبان میں لاگو کیا گیا ہے۔ ماضی میں مقامی طریقے استعمال ہوتے رہے ہیں۔ جاوا کے موجودہ ورژن میں اس کی کم کثرت سے ضرورت ہوتی ہے۔ فی الحال، مقامی طریقوں کی ضرورت ہے جب:
  1. آپ کو جاوا سے کسی ایسی لائبریری کو کال کرنا چاہیے جو کسی دوسری زبان میں لکھی گئی ہو۔
  2. آپ کو سسٹم یا ہارڈ ویئر کے وسائل تک رسائی کی ضرورت ہے جو صرف دوسری زبان (عام طور پر C) کے استعمال سے حاصل کی جاسکتی ہے۔ درحقیقت، سسٹم کے بہت سے فنکشنز جو حقیقی کمپیوٹر کے ساتھ تعامل کرتے ہیں (جیسے ڈسک یا نیٹ ورک ڈیٹا) صرف مقامی طریقہ سے کال کیے جا سکتے ہیں۔
مقامی طریقہ لائبریریوں کے استعمال کے نقصانات بھی اہم ہیں:
  1. JNI/JNA JVM کو غیر مستحکم کر سکتا ہے، خاص طور پر اگر آپ کچھ پیچیدہ کرنے کی کوشش کرتے ہیں۔ اگر آپ کا مقامی طریقہ کچھ غلط کرتا ہے، تو JVM کے کریش ہونے کا امکان ہے۔ نیز، اگر آپ کا مقامی طریقہ ایک سے زیادہ تھریڈز سے بلایا جائے تو بری چیزیں ہوسکتی ہیں۔ اور اسی طرح.
  2. مقامی کوڈ کے ساتھ کسی پروگرام کو ڈیبگ کرنا زیادہ مشکل ہے۔
  3. مقامی کوڈ کے لیے فریم ورک کی علیحدہ تعمیر کی ضرورت ہوتی ہے، جو دوسرے پلیٹ فارمز پر پورٹ کرنے میں مسائل پیدا کر سکتے ہیں۔

سیریلائزیشن کیا ہے؟

کمپیوٹر سائنس میں، ڈیٹا اسٹوریج اور ٹرانسمیشن کے تناظر میں، سیریلائزیشن ڈیٹا کے ڈھانچے یا کسی چیز کی حالت کو ایک فارمیٹ میں ترجمہ کرنے کا عمل ہے جسے بعد میں کسی دوسرے کمپیوٹنگ ماحول میں محفوظ اور بازیافت کیا جا سکتا ہے۔ بٹس کی ایک سیریز حاصل کرنے کے بعد، ان کو سیریلائزیشن فارمیٹ کے مطابق دوبارہ شمار کیا جاتا ہے، اور اصل آبجیکٹ کا ایک سیمنٹی طور پر ایک جیسا کلون بنانے کے لیے استعمال کیا جا سکتا ہے۔ Java خودکار سیریلائزیشن فراہم کرتا ہے، جس میں انٹرفیس کو لاگو کرنے کے لیے آبجیکٹ کی ضرورت ہوتی ہے java.io.Serializable۔ انٹرفیس کا نفاذ کلاس کو "سیریلائز ایبل" کے بطور نشان زد کرتا ہے۔ java.io.Serializable انٹرفیس میں سیریلائزیشن کے طریقے نہیں ہیں، لیکن سیریلائز ایبل کلاس اختیاری طور پر ان طریقوں کی وضاحت کر سکتی ہے جنہیں سیریلائزیشن/ڈی سیریلائزیشن کے عمل کے حصے کے طور پر کہا جائے گا۔ کلاسوں میں تبدیلیاں کرتے وقت، آپ کو غور کرنے کی ضرورت ہے کہ کون سی سیریلائزیشن کے ساتھ مطابقت رکھتا ہے اور کون سا نہیں ہوگا۔ آپ یہاں مکمل ہدایات پڑھ سکتے ہیں۔ میں سب سے اہم نکات دوں گا: غیر مطابقت پذیر تبدیلیاں:
  1. ایک فیلڈ کو حذف کریں؛
  2. درجہ بندی میں کلاس کو اوپر یا نیچے منتقل کریں۔
  3. غیر جامد فیلڈ کو جامد یا غیر عارضی سے عارضی میں تبدیل کرنا؛
  4. اعلان کردہ قدیم ڈیٹا کی قسم کو تبدیل کرنا؛
  5. WriteObjectیا تو طریقہ کو تبدیل کرنا ReadObjectتاکہ وہ پہلے سے طے شدہ فیلڈز کو مزید لکھ یا پڑھ نہ سکیں۔
  6. کلاس Serializableمیں Externalizableیا اس کے برعکس تبدیل کرنا؛
  7. اینوم کلاس کو غیر اینوم میں تبدیل کرنا یا اس کے برعکس؛
  8. ہٹانا Serializableیا Externalizable؛
  9. کلاس میں طریقہ writeReplaceشامل کرنا ۔readResolve
ہم آہنگ تبدیلیاں:
  1. کھیتوں کو شامل کرنا؛
  2. کلاسز کو شامل کرنا / ہٹانا؛
  3. طریقوں کو شامل کرنا WriteObject/ReadObject[طریقے defaultReadObjectیا defaultWriteObjectشروع میں بلایا جانا چاہیے]؛
  4. WriteObject/ReadObjectہٹانے کے طریقے
  5. اضافہ java.io.Serializable_
  6. فیلڈ تک رسائی کو تبدیل کرنا؛
  7. جامد فیلڈ کو غیر جامد یا عارضی سے غیر عارضی میں تبدیل کرنا ۔
پچھلے حصوں کے لنکس: جاوا کور۔ انٹرویو کے سوالات، حصہ 1 جاوا کور۔ انٹرویو کے سوالات، حصہ 2 اصل مضمون خوش مطالعہ!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION