CodeGym /Java Blog /अनियमित /Java में Instanceof और Inheritance
John Squirrels
स्तर 41
San Francisco

Java में Instanceof और Inheritance

अनियमित ग्रुप में प्रकाशित
नमस्ते! पिछले पाठों में, हम विरासत की अवधारणा से संक्षिप्त रूप से परिचित हो चुके हैं। आज, हम इस विषय पर फिर से बात करेंगे, लेकिन फिर से बहुत गहराई से नहीं। हम अभी भी भविष्य में इस पर अधिक विस्तृत पाठ पढ़ने जा रहे हैं। आज हम केवल कुछ व्यावहारिक उदाहरणों पर एक नज़र डालेंगे और जावा में एक दिलचस्प ऑपरेटर से परिचित होंगे।

विरासत

तो, विरासत क्या है? उदाहरण और वंशानुक्रम 101 - 1 विरासत एक प्रोग्रामिंग तंत्र है (जावा सहित) जो आपको मौजूदा के आधार पर एक नई कक्षा घोषित करने देता है। व्युत्पन्न वर्ग तब मूल वर्ग के क्षेत्रों और विधियों तक पहुँच प्राप्त करता है। हमें इसकी आवश्यकता क्यों होगी? ठीक है, कल्पना करें कि आपको एक कार्यक्रम में कई कार कक्षाएं बनाने की आवश्यकता है: ट्रक, रेसकार, सेडान, पिकअप, आदि। कोई भी कोड लिखने से पहले, आप निश्चित रूप से जानते हैं कि इन सभी वर्गों में बहुत कुछ समान है: सभी कारों का एक मॉडल है नाम, निर्माण का वर्ष, इंजन का आकार, अधिकतम गति, आदि। इस स्थिति में, आप यह कर सकते हैं:
  • इन क्षेत्रों को प्रत्येक वर्ग में बनाएँ (जब आप इसे बनाते हैं तो उन्हें प्रत्येक नई कार कक्षा में जोड़ते हैं)
  • फ़ील्ड्स को सभी कारों के लिए मूल Carवर्ग में लाएँ, और फिर कीवर्ड का उपयोग करके कक्षाCar से विशिष्ट प्रकार की कारों के लिए सभी वर्गों को प्राप्त करें।
स्वाभाविक रूप से, दूसरा विकल्प अधिक सुविधाजनक है:

public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
कम से कम, हम कोड के अनावश्यक दोहराव से बचते हैं (और प्रोग्राम लिखते समय हमें हमेशा इसके लिए प्रयास करना चाहिए)। इसके अलावा, हमारे पास एक सरल और समझने योग्य वर्ग संरचना है, जिसमें सभी कारों के लिए सामान्य सभी क्षेत्रों को एक वर्ग में समेकित किया गया है। यदि ट्रकों के पास कोई विशेष क्षेत्र है जो अन्य कारों में नहीं है, तो उन्हें Truckकक्षा में घोषित किया जा सकता है। वही तरीकों के लिए जाता है। Carसभी कारों में कुछ सामान्य व्यवहार होते हैं जिन्हें विधियों के साथ वर्णित किया जा सकता है, जैसे कार शुरू करना, गति बढ़ाना/ब्रेक करना आदि। इन सामान्य तरीकों को मूल वर्ग में समेकित किया जा सकता है, और प्रत्येक विशिष्ट प्रकार की कार अपने व्युत्पन्न वर्गों में अपनी अनूठी क्रियाओं को परिभाषित कर सकती है। .

public class Car {

   public void gas() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {
      
       // Only race cars make pit stops
   }

   public static void main(String[] args) {
      
       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Carहमने कक्षा में सभी कारों के लिए सामान्य तरीके जोड़े । लेकिन, उस वर्ग को देखें F1Car, जो "फॉर्मूला 1" रेस कारों का प्रतिनिधित्व करता है। पिट स्टॉप (तत्काल कार रखरखाव के लिए स्टॉप) केवल दौड़ में किए जाते हैं, इसलिए हमने इस विशिष्ट कार्यक्षमता को संबंधित व्युत्पन्न वर्ग में जोड़ा। उदाहरण और वंशानुक्रम 101 - 2

उदाहरण ऑपरेटर

जावा में, एक विशेष ऑपरेटर होता है, उदाहरण के लिए, यह देखने के लिए कि क्या किसी विशेष वर्ग के आधार पर कोई वस्तु बनाई गई थी। यह चेक के परिणाम के आधार पर सही या गलत रिटर्न देता है। आइए देखें कि यह हमारी कार उदाहरण में कक्षाओं का उपयोग करके कैसे काम करता है:

public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
आउटपुट: सच ऑपरेटर सचinstanceof लौटाता है , क्योंकि हमारे पास एक वस्तु है, और सभी ट्रक कार हैं। वर्ग वर्ग से लिया गया है । सभी ट्रक कॉमन पेरेंट, क्लास के आधार पर बनाए गए हैं। बारीकी से देखें कि ऑपरेटर का उपयोग कैसे किया जाता है। आप इसे बिना किसी अवधि के लिखते हैं, क्योंकि यह एक ऑपरेटर है, न कि एक विधि ("ऑब्जेक्ट उदाहरणऑफ़ क्लास")। चलिए एक और तरीका आजमाते हैं: TruckTruckCarCarinstanceof

public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
आउटपुट: झूठा वर्ग (और कार ऑब्जेक्ट) वर्ग Carसे प्राप्त नहीं होता है । Truckसभी ट्रक कार हैं, लेकिन सभी कार ट्रक नहीं हैं। वस्तुएं वर्ग Carपर आधारित नहीं हैं । Truckएक और उदाहरण:

public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
आउटपुट: ट्रू यहाँ तर्क भी सरल है: जावा में सभी वर्ग, आपके द्वारा बनाई गई कक्षाओं सहित, Objectकक्षा से उतरते हैं (भले ही आप "ऑब्जेक्ट का विस्तार नहीं करते हैं" - यह पहले से ही निहित है)। यह कैसे और कब उपयोगी होगा? विधि को ओवरराइड करते समय ऑपरेटर instanceofका सबसे अधिक उपयोग किया जाता है । equals()उदाहरण के लिए, यहाँ बताया गया है कि कक्षा equalsमें विधि कैसे लागू की जाती है String:

public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
पास की गई वस्तु से तुलना करने से पहले String, विधि यह देखने के लिए परीक्षण करती है कि वस्तु एक स्ट्रिंग भी है या नहीं? तभी यह दो वस्तुओं के गुणों की तुलना करना शुरू करता है। यदि यह परीक्षण मौजूद नहीं था, तो मूल्य और लंबाई वाले किसी भी वस्तु को विधि में पारित किया जा सकता है और एक स्ट्रिंग के साथ तुलना की जा सकती है, जो निश्चित रूप से गलत होगा।
टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION