दिलचस्प पोस्ट
आप केवल अपने कुछ स्थानीय गिट के लिए कैसे धक्का करते हैं? PHP में सीएसवी फ़ाइल से डेटा कैसे निकालें ट्रांज़ेज़ / अनझिप फ़ंक्शन (ज़िप के व्युत्क्रम)? Json से json को सही ढंग से डीकोड नहीं करता है (सरणी पूर्णांक कुंजी के साथ एक हैश हो रहा है) पुरानी सीएसवी फ़ाइल अजगर के लिए नई पंक्ति जोड़ें जावा में डिफ़ॉल्ट एक्सेस मॉडिफायर क्या है? क्या आप HttpURL कनेक्शन कनेक्शन प्रक्रिया की व्याख्या कर सकते हैं? पोस्टग्रेस्क्ल COUNT (DISTINCT …) बहुत धीमा है Sys अपरिभाषित है एप्लिकेशन द्वारा एंड्रॉइड बैटरी उपयोग के बारे में जानकारी कैसे प्राप्त करें अगर एंड्रॉइड ऐप को debuggable पर रिलीज किया जाता है तो क्या होगा? कैसे एक एसक्यूएल सर्वर संग्रहीत कार्यविधि में एक सरणी को पारित करने के लिए UITableView चेकमार्क केवल एक समय में एक पंक्ति ASP.NET Excel निर्यात एन्कोडिंग समस्या जावास्क्रिप्ट रेगुलर एक्सप्रेशन ईमेल सत्यापन

जावा में "यह" और "सुपर" कीवर्ड के बीच अंतर

this और super खोजशब्दों के बीच अंतर क्या है?

दोनों का उपयोग कक्षाओं के कंस्ट्रक्टर्स के अधिकार के लिए किया जाता है? क्या आप में से कोई भी समझा सकता है?

Solutions Collecting From Web of "जावा में "यह" और "सुपर" कीवर्ड के बीच अंतर"

इस स्थिति पर विचार करें

 class Animal { void eat() { System.out.println("animal : eat"); } } class Dog extends Animal { void eat() { System.out.println("dog : eat"); } void anotherEat() { super.eat(); } } public class Test { public static void main(String[] args) { Animal a = new Animal(); a.eat(); Dog d = new Dog(); d.eat(); d.anotherEat(); } } 

आउटपुट होने जा रहा है

 animal : eat dog : eat animal : eat 

तीसरी लाइन "जानवर: खा" छपाई कर रही है क्योंकि हम super.eat() को बुला रहे हैं। अगर हम इसे कहते हैं। this.eat() , तो यह "कुत्ते: खाने" के रूप में मुद्रित होगा।

super को बेस क्लास के तरीकों तक पहुंचने के लिए उपयोग किया जाता है, जबकि इसका उपयोग वर्तमान वर्ग के तरीकों तक पहुंचने के लिए किया जाता है।

यदि आप super() लिखते हैं तो धारणा को बढ़ाते हुए, यह बेस क्लास के कन्स्ट्रक्टर को संदर्भित करता है, और यदि आप इसे लिखते हैं, तो यह उस क्लास के कन्स्ट्रक्टर को संदर्भित करता है जहां आप यह कोड लिख रहे हैं।

this वर्तमान वर्ग के रूप में टाइप किए गए ऑब्जेक्ट का एक संदर्भ है, और super ऑब्जेक्ट का एक संदर्भ है जिसका पैरेंट क्लास के रूप में टाइप किया गया है।

कन्स्ट्रक्टर में, this() मौजूदा क्लास में परिभाषित कन्स्ट्रक्टर को कॉल करता है। super() माता पिता वर्ग में परिभाषित कन्स्ट्रक्टर को कॉल करता है। कन्स्ट्रक्टर को किसी भी अभिभावक वर्ग में परिभाषित किया जा सकता है, लेकिन यह एक मौजूदा क्लास के सबसे निकटतम ओवरराइड को संदर्भित करेगा। इस तरह अन्य कंस्ट्रक्टरों को कॉल केवल कन्स्ट्रक्टर में पहली पंक्ति के रूप में किया जा सकता है।

कॉलिंग विधियां उसी तरह काम करती हैं इसे कॉल करना। this.method() वर्तमान वर्ग में परिभाषित विधि को कॉल करता है जहां super.method() मूल विधि में परिभाषित के अनुसार समान विधि को कॉल करेगा।

आपके प्रश्न से, मैं इसे लेता हूं कि आप वास्तव में इस के उपयोग के बारे में पूछ रहे हैं और कन्स्ट्रक्टर चेनिंग में super ; जैसे

 public class A extends B { public A(...) { this(...); ... } } 

बनाम

 public class A extends B { public A(...) { super(...); ... } } 

अंतर सरल है:

  • मौजूदा फॉर्म में this फॉर्म को एक कन्स्ट्रक्टर के लिए जंजीरों; यानी A कक्षा में।

  • तत्काल सुपरक्लास में एक निर्माता के लिए super फॉर्म चेन; यानी B कक्षा में

this वर्तमान वर्ग के संदर्भ को संदर्भित करता है।
super वर्तमान वर्ग के माता-पिता को संदर्भित करता है (जिसे super कीवर्ड कहा जाता है)

ऐसा this , यह आपको वर्तमान वर्ग के तरीकों / विशेषताओं (अपनी निजी विधियों / विशेषताओं सहित) तक पहुंचने देता है।

super आप सार्वजनिक / संरक्षित विधि / अभिभावक (आधार) वर्ग के गुणों का उपयोग करने की अनुमति देता है आप माता-पिता की निजी विधि / विशेषताओं को नहीं देख सकते हैं

इसका उपयोग वर्तमान वस्तु के तरीकों और क्षेत्रों तक पहुंचने के लिए किया जाता है। इस कारण से, इसका स्थिर अर्थों में कोई अर्थ नहीं है, उदाहरण के लिए

super सुपर-क्लास में गैर-निजी तरीकों और क्षेत्रों तक पहुंच की अनुमति देता है, और कंसल्टेंट्स को क्लास 'कन्स्ट्रक्टरों के भीतर से ही पहुंचने के लिए अनुमति देता है।

जब कोड लिखना आप आमतौर पर खुद को दोहराना नहीं चाहते हैं यदि आपके पास एक ऐसा वर्ग है जिसे विभिन्न संख्याओं के मापदंडों के साथ बनाया जा सकता है, तो अपने आप को दोहराए जाने से बचने के लिए एक सामान्य समाधान है, केवल किसी अन्य निर्माता को चूकने वाले तर्कों में डिफ़ॉल्ट के साथ कॉल करना है। इस पर केवल एक ही परेशान प्रतिबंध है – यह घोषित निर्माता की पहली पंक्ति होना चाहिए। उदाहरण:

 MyClass() { this(default1, default2); } MyClass(arg1, arg2) { validate arguments, etc... note that your validation logic is only written once now } 

super() कंस्ट्रक्टर के लिए, फिर super.method() एक्सेस के विपरीत यह आपके कन्स्ट्रक्टर की पहली पंक्ति होगी। उसके बाद यह बहुत this() कंसल्टेंट्स, ड्राई (खुद को दोहराएं) की तरह ही है, यदि आपके द्वारा विस्तारित कक्षा में एक कन्स्ट्रक्टर है जो कुछ आप चाहते हैं तो इसका उपयोग करें और फिर अपने ऑब्जेक्ट का निर्माण करते रहें, उदाहरण:

 YourClass extends MyClass { YourClass(arg1, arg2, arg3) { super(arg1, arg2) // calls MyClass(arg1, arg2) validate and process arg3... } } 

अतिरिक्त जानकारी:

भले ही आप इसे नहीं देखते हैं, डिफ़ॉल्ट कोई भी तर्क कंसट्रक्टर हमेशा super() कॉल नहीं करता है उदाहरण:

 MyClass() { } 

के बराबर है

 MyClass() { super(); } 

मुझे लगता है कि कई लोगों ने तरीके और चर पर this और super खोजशब्दों का उपयोग करने का उल्लेख किया है – सभी अच्छे बस याद रखें कि कंसल्टेंट्स के अपने उपयोग पर अद्वितीय प्रतिबंध हैं, सबसे उल्लेखनीय है कि उन्हें घोषित कन्स्ट्रक्टर का पहला निर्देश होना चाहिए और आप केवल एक का उपयोग कर सकते हैं।

यह कीवर्ड उसी श्रेणी में कन्स्ट्रक्टर को कॉल करने के लिए उपयोग करता है (अन्य ओवरलोड किए गए कन्स्ट्रक्टर)

वाक्यविन्यास : यह (आर्ग्स सूची); // एक ही कक्षा में अन्य निर्माता में आर्ग्स सूची के साथ संगत

सुपर क्लास को सुपर क्लास में कन्स्ट्रक्टर कॉल करने के लिए उपयोग किया जाता है।

वाक्यविन्यास: सुपर (आर्ग्स सूची); // सुपर वर्ग के निर्माता में आर्ग्स सूची के साथ संगत।

उदाहरण के लिए:

 public class Rect { int x1, y1, x2, y2; public Rect(int x1, int y1, int x2, int y2) // 1st constructor { ....//code to build a rectangle } } public Rect () { // 2nd constructor this (0,0,width,height) // call 1st constructor (because it has **4 int args**), this is another way to build a rectangle } public class DrawableRect extends Rect { public DrawableRect (int a1, int b1, int a2, int b2) { super (a1,b1,a2,b2) // call super class constructor (Rect class) } } 

1. सुपर खोजशब्द का उपयोग।

यदि आपकी पद्धति अपने सुपरक्लास के तरीकों में से एक को ओवरराइड करती है, तो आप कीवर्ड सुपर के उपयोग के माध्यम से ओवरराइड पद्धति का उपयोग कर सकते हैं। आप छिपे हुए क्षेत्र का उल्लेख करने के लिए सुपर उपयोग भी कर सकते हैं (हालांकि छुपाने वाले क्षेत्रों को हतोत्साहित किया गया है)। इस वर्ग पर विचार करें, सुपर क्लास:

 public class Superclass { public void printMethod() { System.out.println("Printed in Superclass."); } 

}

यहां एक उपवर्ग है, जिसे उपवर्ग कहा जाता है, जो printMethod () को ओवरराइड करता है:

 public class Subclass extends Superclass { // overrides printMethod in Superclass public void printMethod() { super.printMethod(); System.out.println("Printed in Subclass"); } public static void main(String[] args) { Subclass s = new Subclass(); s.printMethod(); } 

}

उपवर्ग के भीतर, सरल नाम printMethod () उप-वर्ग में घोषित एक को संदर्भित करता है, जो सुपरक्लास में एक को ओवरराइड करता है। इसलिए, Superclass से विरासत में मिली printMethod () को संदर्भित करने के लिए, उप-क्लास को एक योग्य नाम का उपयोग करना चाहिए, जैसा कि दिखाया गया है सुपर का उपयोग करना। उपवर्ग संकलन और निष्पादित निम्न छापती है:

सुपर क्लास में मुद्रित उपवर्ग में मुद्रित


2. इस कीवर्ड का उपयोग फ़ील्ड के साथ इसका प्रयोग करें

इस खोजशब्द का उपयोग करने के लिए सबसे आम कारण यह है कि एक क्षेत्र एक विधि या कन्स्ट्रक्टर पैरामीटर से छायांकित है।

उदाहरण के लिए, प्वाइंट क्लास इस तरह लिखा गया था

 public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; } 

}

लेकिन यह इस तरह लिखा जा सकता था:

 public class Point { public int x = 0; public int y = 0; //constructor public Point(int x, int y) { this.x = x; this.y = y; } 

}

कंस्ट्रक्टर के प्रत्येक तर्क ऑब्जेक्ट के फ़ील्ड में से एक छाया – कन्स्ट्रक्टर एक्स के अंदर कन्स्ट्रक्टर की पहली तर्क की एक स्थानीय प्रति है। प्वाइंट क्षेत्र x का संदर्भ लेने के लिए, कन्स्ट्रक्टर को इस .x का उपयोग करना चाहिए।

एक निर्माता के साथ इस का उपयोग करना

एक निर्माता के भीतर से, आप इस कीवर्ड का उपयोग एक ही कक्षा में किसी अन्य कन्स्ट्रक्टर को कॉल करने के लिए भी कर सकते हैं। ऐसा करने के लिए एक स्पष्ट निर्माता आह्वान कहा जाता है। यहां एक और आयत वर्ग है, जिसमें ऑब्जेक्ट सेक्शन में से एक अलग कार्यान्वयन है।

 public class Rectangle { private int x, y; private int width, height; public Rectangle() { this(0, 0, 0, 0); } public Rectangle(int width, int height) { this(0, 0, width, height); } public Rectangle(int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; } 

}

इस वर्ग में कन्स्ट्रक्टरों का एक सेट शामिल है प्रत्येक कंस्ट्रक्टर कुछ या सभी आयत के सदस्य चर को आरंभ करता है कंसल्टर्स किसी भी सदस्य चर के लिए एक डिफ़ॉल्ट मान प्रदान करते हैं, जिसका आरंभिक मान एक तर्क द्वारा प्रदान नहीं किया जाता है। उदाहरण के लिए, कोई-तर्क कन्स्ट्रक्टर चार-तर्क कन्स्ट्रक्टर को चार 0 मानों के साथ कहता है और दो-तर्क कन्स्ट्रक्टर चार-आर्गिमेंट कन्स्ट्रक्टर को दो 0 मानों के साथ कहते हैं। पहले की तरह, संकलक निर्धारित करता है कि कौन से निर्माता कॉल करने के लिए, संख्या और तर्कों के प्रकार के आधार पर।

यदि मौजूद है, तो एक अन्य निर्माता के आमंत्रण को कन्स्ट्रक्टर में पहली पंक्ति होना चाहिए।

सुपर () और यह ()

  • सुपर () – मूल वर्ग कन्स्ट्रक्टर को कॉल करने के लिए।
  • यह () – उसी श्रेणी के कंस्ट्रक्टर को कॉल करने के लिए

ध्यान दें:

  • हम सुपर () और यह () केवल कंस्ट्रक्टर में कहीं भी नहीं उपयोग कर सकते हैं, ऐसा करने का कोई भी प्रयास कंपाइल-टाइम एरर का नेतृत्व करेगा

  • हमें या तो सुपर () या यह () को कन्स्ट्रक्टर की पहली पंक्ति के रूप में रखना होगा, लेकिन साथ ही साथ दोनों नहीं।

सुपर और यह कीवर्ड

  • सुपर – अभिभावक वर्ग के सदस्यों को कॉल करने के लिए (वेरिएबल और तरीके)
  • यह – वही कक्षा सदस्यों (चर और विधियों) को कॉल करने के लिए।

नोट: हम स्थिर क्षेत्रों (स्थैतिक ब्लॉक या विधि) को छोड़कर किसी भी कक्षा में कहीं भी उन दोनों का उपयोग कर सकते हैं, ऐसा करने का कोई भी प्रयास संकलन-समय त्रुटि के कारण होगा।

यह लगभग एक ऐसी स्थिति में प्रतीत होता है जहां एक व्यक्ति ने एक सवाल पूछा है कि हर कोई केवल एक ही संभावित उत्तर के लिए देखता है। फिर भी व्यक्ति उत्तर देने के लिए प्रत्येक उत्तर को कॉल करता है, इसलिए हर कोई एक ही उत्तर पर एक अलग प्रकार की कोशिश करता है क्योंकि इसका उत्तर देने का एकमात्र तरीका प्रतीत होता है।

इसलिए, एक व्यक्ति ए के साथ शुरू होता है एक वर्ग है और बी इसके उपवर्ग है अगले व्यक्ति सी के साथ शुरू होता है एक कक्षा है और बी इसके उपवर्ग है एक तिहाई व्यक्ति इसका थोड़ा अलग ढंग से उत्तर देता है ए एक वर्ग है और बी का विस्तार होता है। फिर चौथा एक कहते हैं, ए कक्षा है जो बी के रूप में विस्तारित हो जाती है। या पशु एक वर्ग है और कुत्ते एक उपवर्ग है या राष्ट्र एक वर्ग है और चीन राष्ट्र का एक विशेष मामला है।

या बेहतर अभी तक, मनुष्य एक वर्ग है, और क्लार्क केंट मैन का एक उपवर्ग है। तो, सुपरमैन … नहीं … जो जावा के मामले में काम नहीं करता ….

खैर, यह एक अलग वर्णन के साथ आने के लिए कम से कम एक और प्रयास है, जिसकी कोई बात नहीं है, जिससे चीजें अलग-अलग समझा जा सकती हैं। Arggghhhh।

मुझे लगता है कि हर किसी की व्याख्या मेरे अलावा काम करती है