यहाँ, मैं अपनी कक्षा का उदाहरण बना रहा हूँ
नहीं, आप अपने अमूर्त वर्ग का उदाहरण यहाँ नहीं बना रहे हैं। बल्कि आप अपने अमूर्त वर्ग के एक अनाम उपवर्ग का एक उदाहरण बना रहे हैं । और फिर आप उपवर्ग ऑब्जेक्ट की ओर इशारा करते हुए अपने अमूर्त वर्ग संदर्भ पर विधि लागू कर रहे हैं ।
यह व्यवहार जेएलएस में स्पष्ट रूप से सूचीबद्ध है - धारा # 15.9.1 : -
यदि वर्ग उदाहरण सृजन अभिव्यक्ति एक वर्ग निकाय में समाप्त हो जाती है, तो तत्काल होने वाली कक्षा एक अनाम वर्ग है। फिर:
- यदि टी एक वर्ग को दर्शाता है, तो टी द्वारा नामित वर्ग का एक अनाम प्रत्यक्ष उपवर्ग घोषित किया जाता है। यह एक संकलित समय त्रुटि है यदि टी द्वारा चिह्नित वर्ग अंतिम वर्ग है।
- यदि T एक इंटरफ़ेस को दर्शाता है, तो ऑब्जेक्ट का एक गुमनाम प्रत्यक्ष उपवर्ग जो T द्वारा नामित इंटरफ़ेस को लागू करता है, घोषित किया जाता है।
- किसी भी स्थिति में, उपवर्ग का शरीर वर्ग उदाहरण में वर्ग बोध दिया जाता है।
- क्लास को तत्काल किया जाना अनाम उपवर्ग है।
जोर मेरा।
इसके अलावा, JLS - धारा # 12.5 में , आप ऑब्जेक्ट क्रिएशन प्रोसेस के बारे में पढ़ सकते हैं । मैं यहाँ से एक कथन उद्धृत करूँगा: -
जब भी कोई नया वर्ग उदाहरण बनाया जाता है, तो उसके लिए स्मृति स्थान को कक्षा प्रकार में घोषित सभी उदाहरण चर के लिए कमरे के साथ आवंटित किया जाता है और श्रेणी के प्रत्येक सुपरक्लास में घोषित सभी उदाहरण चर, जिसमें सभी उदाहरण चर छिपे हो सकते हैं, शामिल हैं।
परिणाम के रूप में नई बनाई गई वस्तु के संदर्भ से ठीक पहले, संकेत दिया गया निर्माणकर्ता को निम्नलिखित प्रक्रिया का उपयोग करके नई वस्तु को आरंभ करने के लिए संसाधित किया जाता है:
मेरे द्वारा दिए गए लिंक पर आप पूरी प्रक्रिया के बारे में पढ़ सकते हैं।
व्यावहारिक रूप से यह देखने के लिए कि जिस कक्षा को तत्काल किया जा रहा है वह एक अनाम उप-वर्ग है , आपको बस अपनी दोनों कक्षाओं को संकलित करने की आवश्यकता है। मान लीजिए कि आपने उन वर्गों को दो अलग-अलग फ़ाइलों में रखा है:
My.java:
abstract class My {
public void myMethod() {
System.out.print("Abstract");
}
}
Poly.java:
class Poly extends My {
public static void main(String a[]) {
My m = new My() {};
m.myMethod();
}
}
अब, अपनी स्रोत फ़ाइलों का संकलन करें:
javac My.java Poly.java
अब निर्देशिका में जहां आपने स्रोत कोड संकलित किया है, आपको निम्न वर्ग फाइलें दिखाई देंगी:
My.class
Poly$1.class // Class file corresponding to anonymous subclass
Poly.class
उस वर्ग देखें - Poly$1.class
। यह नीचे दिए गए कोड का उपयोग करके आप तुरंत उप-लिंक किए गए अनाम उपवर्ग के अनुरूप कंपाइलर द्वारा बनाई गई क्लास फाइल है:
new My() {};
इसलिए, यह स्पष्ट है कि एक अलग वर्ग को तत्काल किया जा रहा है। यह सिर्फ इतना है, कि संकलक द्वारा संकलन के बाद ही उस वर्ग को एक नाम दिया जाता है।
सामान्य तौर पर, आपकी कक्षा के सभी अनाम उपवर्गों का नाम इस प्रकार रखा जाएगा:
Poly$1.class, Poly$2.class, Poly$3.class, ... so on
वे संख्याएँ उस क्रम को निरूपित करती हैं जिसमें वे अनाम वर्ग संलग्न वर्ग में दिखाई देते हैं।
B
एक सार में से एक सेA
, निर्माण के भाग के दौरान कीB
उदाहरण है, जो चल रहा मिलकर बनता हैA
की निर्माता, वस्तु के क्रम प्रकार वास्तव में हैA
। हालांकि केवल अस्थायी।