नमस्ते! पिछले पाठों में, हम विरासत की अवधारणा से संक्षिप्त रूप से परिचित हो चुके हैं। आज, हम इस विषय पर फिर से बात करेंगे, लेकिन फिर से बहुत गहराई से नहीं। हम अभी भी भविष्य में इस पर अधिक विस्तृत पाठ पढ़ने जा रहे हैं। आज हम केवल कुछ व्यावहारिक उदाहरणों पर एक नज़र डालेंगे और जावा में एक दिलचस्प ऑपरेटर से परिचित होंगे।
विरासत
तो, विरासत क्या है? विरासत एक प्रोग्रामिंग तंत्र है (जावा सहित) जो आपको मौजूदा के आधार पर एक नई कक्षा घोषित करने देता है। व्युत्पन्न वर्ग तब मूल वर्ग के क्षेत्रों और विधियों तक पहुँच प्राप्त करता है। हमें इसकी आवश्यकता क्यों होगी? ठीक है, कल्पना करें कि आपको एक कार्यक्रम में कई कार कक्षाएं बनाने की आवश्यकता है: ट्रक, रेसकार, सेडान, पिकअप, आदि। कोई भी कोड लिखने से पहले, आप निश्चित रूप से जानते हैं कि इन सभी वर्गों में बहुत कुछ समान है: सभी कारों का एक मॉडल है नाम, निर्माण का वर्ष, इंजन का आकार, अधिकतम गति, आदि। इस स्थिति में, आप यह कर सकते हैं:- इन क्षेत्रों को प्रत्येक वर्ग में बनाएँ (जब आप इसे बनाते हैं तो उन्हें प्रत्येक नई कार कक्षा में जोड़ते हैं)
- फ़ील्ड्स को सभी कारों के लिए मूल
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" रेस कारों का प्रतिनिधित्व करता है। पिट स्टॉप (तत्काल कार रखरखाव के लिए स्टॉप) केवल दौड़ में किए जाते हैं, इसलिए हमने इस विशिष्ट कार्यक्षमता को संबंधित व्युत्पन्न वर्ग में जोड़ा।
उदाहरण ऑपरेटर
जावा में, एक विशेष ऑपरेटर होता है, उदाहरण के लिए, यह देखने के लिए कि क्या किसी विशेष वर्ग के आधार पर कोई वस्तु बनाई गई थी। यह चेक के परिणाम के आधार पर सही या गलत रिटर्न देता है। आइए देखें कि यह हमारी कार उदाहरण में कक्षाओं का उपयोग करके कैसे काम करता है:
public class Truck extends Car {
public static void main(String[] args) {
Truck truck = new Truck();
System.out.println(truck instanceof Car);
}
}
आउटपुट: सच ऑपरेटर सचinstanceof
लौटाता है , क्योंकि हमारे पास एक वस्तु है, और सभी ट्रक कार हैं। वर्ग वर्ग से लिया गया है । सभी ट्रक कॉमन पेरेंट, क्लास के आधार पर बनाए गए हैं। बारीकी से देखें कि ऑपरेटर का उपयोग कैसे किया जाता है। आप इसे बिना किसी अवधि के लिखते हैं, क्योंकि यह एक ऑपरेटर है, न कि एक विधि ("ऑब्जेक्ट उदाहरणऑफ़ क्लास")। चलिए एक और तरीका आजमाते हैं: Truck
Truck
Car
Car
instanceof
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
, विधि यह देखने के लिए परीक्षण करती है कि वस्तु एक स्ट्रिंग भी है या नहीं? तभी यह दो वस्तुओं के गुणों की तुलना करना शुरू करता है। यदि यह परीक्षण मौजूद नहीं था, तो मूल्य और लंबाई वाले किसी भी वस्तु को विधि में पारित किया जा सकता है और एक स्ट्रिंग के साथ तुलना की जा सकती है, जो निश्चित रूप से गलत होगा।
GO TO FULL VERSION