CodeGym /جاوا بلاگ /Random-UR /جاوا میں وراثت
John Squirrels
سطح
San Francisco

جاوا میں وراثت

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

جاوا میں وراثت کے کلیدی اداکار

  • وراثت ایک تصور ہے کہ ایک طبقہ اپنے والدین کی خصوصیات اور طریقوں کو جزوی طور پر یا مکمل طور پر دہرا سکتا ہے (وہ طبقہ جس سے اسے وراثت ملتی ہے)۔
  • چائلڈ کلاس، یا ذیلی کلاس، یا توسیع شدہ کلاس، یا اخذ شدہ کلاس ایک ایسی کلاس ہے جو کسی اور کلاس سے وراثت میں ملتی ہے۔
  • پیرنٹ کلاس، سپر کلاس، یا بیس کلاس ایک ایسی کلاس ہے جس کے متعدد فنکشنز ہوتے ہیں، اور یہ فنکشنز کسی اور کلاس (چائلڈ کلاس) کے ذریعے پاس (وراثت میں) ہو سکتے ہیں۔
  • طریقہ اوور رائیڈنگ اخذ شدہ کلاس کے طریقہ کار کے رویے کو تبدیل کر رہا ہے۔ یہ عام طور پر زیادہ مخصوص، بہتر سلوک ہوتا ہے۔ اگر آپ وارث میں کسی ایسے طریقہ کو اوور رائیڈ کرتے ہیں جو پہلے سے ہی پیرنٹ کلاس میں ہے، تو یہ والدین کے طریقہ کار کی جگہ لے لیتا ہے۔
  • ایک کلاس میں صرف ایک آبائی طبقہ ہو سکتا ہے، لیکن ہر طبقے میں کئی "بچے" ہو سکتے ہیں۔

یہ کیسے کام کرتا ہے

وراثت کا سلسلہ انتہائی تجریدی طبقے سے زیادہ ٹھوس طبقے کی طرف جاتا ہے۔ یعنی سپر کلاس کلاسز کے سلسلہ میں سب سے زیادہ تجریدی ہے۔ اکثر اسے خلاصہ کے طور پر بیان کیا جاتا ہے (بیس کلاس جس پر عمل درآمد کی ضرورت نہیں ہوتی ہے)۔ مزید تمام کلاسز زیادہ مخصوص ہیں۔ مثال کے طور پر، "گیجٹ" نامی ایک کلاس ہے۔ اس میں فیلڈ (یا ریاست) "وزن" فیلڈ بیٹری کی گنجائش، فیلڈ چارج لیول اور طریقے (یا رویہ) "کام" اور چارجنگ ہو سکتی ہے۔ اس صورت میں، طریقے خلاصہ ہوسکتے ہیں، یعنی ان کا کوئی خاص نفاذ نہیں ہے۔ اگرچہ ہم یہ نہیں کہہ سکتے کہ یہ کس قسم کا گیجٹ ہے، یہ بالکل کوئی ریچارج ایبل گیجٹ ہے۔ آئیے گیجٹ کلاس کا ایک فون سب کلاس بنائیں۔ اب اسے وزن اور بیٹری کو دوبارہ متعین کرنے کی ضرورت نہیں ہے، یہ انہیں صرف تجریدی گیجٹ سے وراثت میں ملا ہے۔ لیکن کام کے رویے کو واضح کرنے کی ضرورت ہوگی. آپ دوسرے فیلڈز "اسکرین ڈائیگنل"، کنیکٹرز وغیرہ بھی شامل کر سکتے ہیں۔ آپ ایک نیا طریقہ شامل کر سکتے ہیں "آپریٹنگ سسٹم کو اپ ڈیٹ کریں"۔ اگلا، ہم دو مزید کلاسیں بنا سکتے ہیں اور دونوں فون، اینڈرائیڈ اور آئی فون سے وراثت میں ملیں گے۔ دونوں طبقے گیجٹ اور اسمارٹ فون کے تمام شعبوں اور طریقوں کے وارث ہیں، اور طریقوں کو اوور رائڈ کیا جا سکتا ہے۔ فرسٹ کلاس کو "برانڈ نیم" فیلڈ کی ضرورت ہوتی ہے، جب کہ آئی فون کو اس فیلڈ کی ضرورت نہیں ہوتی، کیونکہ صرف ایک کمپنی ایسے اسمارٹ فون تیار کرتی ہے۔
class Gadget {}
}
//subclass of Gadget class
class Phone extends Gadget {}
//subclass of Phone class
class IPhone extends Phone {}
//subclass of Phone class
class AndroidPhone extends Phone {}
چائلڈ کلاس کو والدین کی کلاس کے تمام عوامی اور محفوظ ممبران وراثت میں ملتے ہیں۔ اس سے کوئی فرق نہیں پڑتا ہے کہ ذیلی کلاس کس پیکیج میں ہے۔ اگر چائلڈ کلاس پیرنٹ کلاس کے پیکیج میں ہے، تو یہ والدین کے پیکیج-پرائیویٹ ممبروں کو بھی وراثت میں ملتی ہے۔ آپ وراثت میں ملنے والے اراکین کو جیسا ہے استعمال کر سکتے ہیں، انہیں تبدیل کر سکتے ہیں، انہیں چھپا سکتے ہیں، یا نئے اراکین کو شامل کر سکتے ہیں:
  • آپ وراثت میں ملنے والی فیلڈز کو براہ راست استعمال کر سکتے ہیں جیسے کہ کوئی اور فیلڈ۔
  • آپ چائلڈ کلاس میں ایک فیلڈ کا اعلان کر سکتے ہیں جس کا نام والدین کی کلاس میں ہے۔ یہ اسے چھپا رہا ہے (یہ نہ کرنا بہتر ہے)۔
  • آپ چائلڈ کلاس میں نئے فیلڈز کا اعلان کر سکتے ہیں (جو پیرنٹ کلاس کے پاس نہیں ہے)۔
  • وراثت میں ملنے والے طریقوں کو اخذ شدہ کلاس میں اوور رائیڈ کیے بغیر براہ راست استعمال کیا جا سکتا ہے۔
  • نیز آپ ذیلی کلاس میں ایک نیا مثال کا طریقہ لکھ سکتے ہیں جس پر پیرنٹ کلاس میں ایک طریقہ کے طور پر ایک ہی دستخط ہیں۔ یہ طریقہ کار اسے اوور رائیڈ کرتا ہے۔
  • آپ چائلڈ کلاس میں نئے طریقوں کا اعلان کر سکتے ہیں جن کا پیرنٹ کلاس میں اعلان نہیں کیا گیا تھا۔
  • آپ سب کلاس کنسٹرکٹر لکھ سکتے ہیں جو سپرکلاس کنسٹرکٹر کو یا تو واضح طور پر یا سپر کلیدی لفظ کے ساتھ کال کرتا ہے۔

مثال

آئیے وزن اور ٹریڈ مارک فیلڈز کے ساتھ ساتھ ایک work() طریقہ کے ساتھ ایک بنیادی MusicalInstrument کلاس بنائیں۔ ہم ایک کنسٹرکٹر کی بھی تعریف کرتے ہیں۔
public class MusicalInstrument {
   int weight;
   String tradeMark;

   public MusicalInstrument(int weight, String tradeMark) {
       this.weight = weight;
       this.tradeMark = tradeMark;
   }

   public void work() {
       System.out.println("the instrument is playing...");
   }
}
یہ مکمل طور پر واضح نہیں ہے کہ یہ کس قسم کا موسیقی کا آلہ ہے اور اسے کیسے بجانا ہے۔ آئیے ایک اور مخصوص ساز بنائیں، وائلن۔ اس میں وہی فیلڈز ہوں گے جو میوزیکل انسٹرومنٹ میں ہوتے ہیں (انہیں سپر کلیدی لفظ کا استعمال کرتے ہوئے کنسٹرکٹر میں بلایا جائے گا۔ ہم کام کے طریقہ کار کو بھی اوور رائیڈ کر سکتے ہیں اور وائلن سٹرنگ کو سٹرنگ کے ذریعے سیٹ کرنے کا طریقہ بنا سکتے ہیں۔
public class Violin extends MusicalInstrument {
   String master;
   String owner;
   int age;
   boolean isTuned;

   public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
       super(weight, tradeMark);
       this.master = master;
       this.owner = owner;
       this.age = age;
       this.isTuned = isTuned;
   }

   @Override
   public void work() {
       System.out.println("THe violin's playing");

   }

   public void violinTuning () {
     System.out.println("I'm tuning 1st string...");
     System.out.println("I'm tuning 2nd string...");
     System.out.println("I'm tuning 3rd string...");
     System.out.println("I'm tuning 4th string...");
}


}
آئیے وائلن کلاس کو جانچنے کے لیے ایک ڈیمو کلاس بنائیں اور دیکھیں کہ وراثت کیسے کام کرتی ہے۔
public class InheritDemo {

   public static void main(String[] args) {

       Violin violin = new Violin(1, null, "Amati", "Kremer", 285, false);
       violin.violinTuning();
       violin.work();
   }
}
اس صورت میں، پروگرام کی پیداوار مندرجہ ذیل ہو گی:
میں پہلی سٹرنگ کو ٹیون کر رہا ہوں... میں دوسری سٹرنگ کو ٹیون کر رہا ہوں... میں تیسری سٹرنگ کو ٹیون کر رہا ہوں... میں چوتھی سٹرنگ کو ٹیون کر رہا ہوں... وائلن بجا رہا ہے
یعنی اگر چائلڈ کلاس میں کوئی اوور رائڈ میتھڈ ہو تو ابابی طریقہ نہیں کہا جائے گا۔ اگر یہ وہاں نہیں ہے تو کیا ہوگا؟ یعنی، وائلن کلاس اس طرح نظر آتی ہے:
public class Violin extends MusicalInstrument {
   String master;
   String owner;
   int age;
   boolean isTuned;

   public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
       super(weight, tradeMark);
       this.master = master;
       this.owner = owner;
       this.age = age;
       this.isTuned = isTuned;
   }

  // @Override


 //  }

   public void violinTuning () {
       System.out.println("I'm tuning 1st string...");
       System.out.println("I'm tuning 2nd string...");
       System.out.println("I'm tuning 3rd string...");
       System.out.println("I'm tuning 4th string...");
   }

}
آؤٹ پٹ ہے:
میں پہلی سٹرنگ کو ٹیون کر رہا ہوں... میں دوسری سٹرنگ کو ٹیون کر رہا ہوں... میں تیسری سٹرنگ کو ٹیون کر رہا ہوں... میں چوتھی سٹرنگ کو ٹیون کر رہا ہوں... ساز چل رہا ہے...
یعنی آبائی طریقہ خود بخود کہلائے گا۔ ویسے، چائلڈ کلاس کی تعریف آباؤ اجداد کے ذریعے کی جا سکتی ہے، یعنی اپکاسٹنگ کرنا:
Parent parent = new Child()
اس ابتداء کا استعمال صرف پیرنٹ کلاس میں موجود اراکین اور اوور رائیڈڈ طریقوں تک رسائی کے لیے کیا جاتا ہے۔ ہماری مثال میں یہ ہوگا:
public class InheritDemo {

   public static void main(String[] args) {

       MusicalInstrument violin = new Violin(1, null, "Amati", "Kremer", 285, false);
       //violin.violinTuning();
       violin.work();
   }
}
ایسی صورت میں، ہم وائلن کے طریقہ کار کو ترتیب دینے کے قابل نہیں ہیں۔ تاہم ایک ہی وقت میں، descendant کلاس کا work() طریقہ کہا جائے گا، اگر یہ موجود ہے۔

جاوا پلیٹ فارم کلاس کا درجہ بندی

جاوا میں، ہر چیز کلاسوں سے بنی ہے اور وہ ایک درجہ بندی کے ماتحت ہیں۔ سوال یہ پیدا ہوتا ہے کہ کیا کوئی ایسا طبقہ ہے جس سے باقی سب وراثت میں ملے ہیں؟ جواب ہاں میں ہے، واقعی ایسی کلاس موجود ہے۔ اور اسے صرف Object کہتے ہیں ۔ java.lang پیکیج سے آبجیکٹ کلاس، تمام کلاسوں کے لیے عام رویے کی وضاحت اور نفاذ کرتی ہے، بشمول وہ جو آپ تخلیق کرتے ہیں ۔ جاوا پلیٹ فارم میں، بہت سی کلاسیں براہ راست آبجیکٹ سے اخذ ہوتی ہیں ، دوسری کلاسیں ان میں سے کچھ کلاسوں سے اخذ کرتی ہیں، اور اسی طرح ایک کلاس کا درجہ بندی بناتی ہیں۔

جاوا میں وراثت کی اقسام

آئیے جاوا میں وراثت کی چند اقسام کو اجاگر کرتے ہیں۔ 1. سنگل وراثت یہ قسم بالکل اسی طرح ہے جیسے اوپر کی ہماری مثال میں، ذیلی کلاسیں ایک سپر کلاس کی خصوصیات کو وراثت میں حاصل کرتی ہیں۔ نیچے دی گئی تصویر میں، کلاس A اخذ شدہ کلاس B کے لیے ایک بیس کلاس کے طور پر کام کرتی ہے۔ کلاس B سے وراثت میں ملا ہے۔ جاوا میں، کلاس براہ راست دادا دادی کے اراکین تک رسائی حاصل نہیں کر سکتی۔ 3. درجہ بندی کی وراثت درجہ بندی کی وراثت میں، ایک کلاس ایک سے زیادہ ذیلی طبقے کے لیے ایک سپر کلاس (بیس کلاس) کے طور پر کام کرتی ہے۔ اوپر، ہم نے فون کلاس کی ایک مثال دی، جس میں دو "بچے" ہو سکتے ہیں - اینڈرائیڈ فون اور آئی فون۔
class A {
    public void printA() {
System.out.println("A");
 }
}

class B extends A {
    public void printB() {
 System.out.println(" B"); }
}

class C extends A {
    public void printC() {
System.out.println("C");
}
}

class D extends A {
    public void printD() {
System.out.println("D");
 }
}

public class Demo {
    public static void main(String[] args)
    {
        B objB = new B();
        objB.printA();
        objB.printB();

        C objC = new C();
        objC.printA();
        objC.printC();

        D objD = new D();
        objD.printA();
        objD.printD();
    }
}
آؤٹ پٹ ہے:
اے بی اے سی اے ڈی
4. ایک سے زیادہ وراثت، یعنی کئی آباؤ اجداد کی موجودگی ... لیکن انتظار کریں، کلاسک متعدد وراثت جاوا میں تعاون یافتہ نہیں ہے۔ کسی حد تک، اسے کلاسز نہیں بلکہ انٹرفیس کا استعمال کرتے ہوئے لاگو کیا جا سکتا ہے۔
interface A {
   public void printA();
}

interface B {
   public void printB();
}

interface C extends A, B {
   public void print();
}
class InheritDemo implements C {
   @Override
   public void print()
   {
       System.out.println("Print something");
   }

   @Override
   public void printA() {
   }

   @Override
   public void printB() {
   }
}
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION