जावा भाषा में गौरवशाली वर्ग


96

मानक जावा एपीआई में कुछ कक्षाओं को अन्य वर्गों से थोड़ा अलग माना जाता है। मैं उन वर्गों के बारे में बात कर रहा हूं जिन्हें संकलक और / या जेवीएम से विशेष समर्थन के बिना लागू नहीं किया जा सकता है।

मैं जिन लोगों के साथ आता हूं वे हैं:

  • Object (जाहिर है) के रूप में, अन्य बातों के अलावा यह एक सुपर क्लास नहीं है।
  • String भाषा के रूप में + ऑपरेटर के लिए विशेष समर्थन है।
  • Thread चूंकि यह इस जादुई शुरुआत () विधि के बावजूद है कि कोई भी बायोटेक निर्देश नहीं है जो निष्पादन को "कांटे" करता है।

मुझे लगता है कि ये सभी वर्ग एक तरह से या किसी अन्य के रूप में उल्लिखित हैं। यदि मैं गलत हूं तो मुझे सही करों।

वैसे भी, ऐसी अन्य कौन सी कक्षाएं मौजूद हैं? क्या जावा भाषा में "गौरवशाली वर्गों" की कोई पूरी सूची है?


2
पीढ़ी लगभग फिट है, लेकिन काफी नहीं। वे एक संकलक चाल का उपयोग करके कार्यान्वित किए गए हैं, लेकिन वे एक वर्ग से अलग नहीं हैं।
छिपकली

2
वे सभी श्रद्धा के प्रकार हैं। ;-)
स्टारबेल

1
"थ्रेड.स्टार्ट" जादुई है? निश्चित रूप से यह सिर्फ कुछ मूल कोड को ऐसा करने के लिए कहा जाता है?
जेकरोड

उस सोच ने मुझे भी प्रभावित किया है। शायद जेएनआई थ्रेड क्लास को लागू करने के लिए पर्याप्त है। मुझे लगता है कि अगर मैं ऐसा करने की कोशिश करूंगा, तो मैं कुछ ओएस-स्तरीय थ्रेड एपी का उपयोग करूंगा, स्टार्ट () पद्धति के कार्यान्वयन में निष्पादन को कांटा, कांटे वाले धागे में रन () विधि को निष्पादित करें, और वापस लौटें। लेकिन तब मेरा OS थ्रेड चलता रहेगा। क्या जेवीएम द्वारा बनाए गए धागों के साथ यह आसानी से चलेगा? और जेएलएस मेमोरी मॉडल और इतने पर सम्मान?
aioobe

2
युक्ति के अनुसार, थ्रेड बनाने का एकमात्र तरीका थ्रेड क्लास ( java.sun.com/docs/books/jvms/second_edition/html/… ) से है। बेशक, यह JVM के साथ कुछ भोले स्तर के संचार पर निर्भर करता है, लेकिन अगर आपने अपना खुद का JNI किया, तो आप एक धागा शुरू कर सकते हैं, लेकिन आपको यह समझ में नहीं आएगा कि आप क्या कर रहे हैं (ताले, मेमोरी मॉडल, आदि)। )। थ्रेड विशेषाधिकार प्राप्त है कि कल्पना इसे एक विशेष विशेषाधिकार प्रदान करती है - एक धागा शुरू करने का एकमात्र तरीका।
यिशैई

जवाबों:


35

बहुत सारे अलग-अलग उत्तर हैं, इसलिए मैंने सोचा कि उन सभी को इकट्ठा करना उपयोगी होगा (और कुछ जोड़ें):

कक्षाएं

  • AutoBoxing वर्ग - संकलक केवल विशिष्ट वर्गों के लिए अनुमति देता है
  • वर्ग - के अपने स्वयं के शाब्दिक (उदाहरण के लिए int.class) है। मैं नए उदाहरणों को बनाए बिना इसके सामान्य टाइपिंग को भी जोड़ूंगा।
  • स्ट्रिंग - यह अतिभारित है + -ऑपरेटर और शाब्दिक का समर्थन
  • एनम - एकमात्र वर्ग जिसे स्विच स्टेटमेंट में इस्तेमाल किया जा सकता है (जल्द ही स्ट्रिंग के लिए भी एक विशेषाधिकार दिया जाएगा)। यह अन्य चीजों को भी करता है (स्वचालित स्थैतिक विधि निर्माण, क्रमांकन हैंडलिंग, आदि), लेकिन उन लोगों को सैद्धांतिक रूप से कोड के साथ पूरा किया जा सकता है - यह सिर्फ बॉयलरप्लेट का एक बहुत कुछ है, और कुछ बाधाओं को उपवर्गों में लागू नहीं किया जा सकता है (जैसे विशेष उपशमन नियम) लेकिन जो आप कभी नहीं कर सकते थे, वह यह है कि किसी एनम की निजीकृत स्थिति के बिना इसे स्विच स्टेटमेंट में शामिल नहीं किया जा सकता है।
  • ऑब्जेक्ट - सभी ऑब्जेक्ट्स की जड़ (और मैं इसके क्लोन और फाइनल तरीके जोड़ूंगा, ऐसी कोई चीज नहीं है जिसे आप लागू कर सकते हैं)
  • संदर्भ : WeakReference, SoftReference, PhantomReference
  • थ्रेड - भाषा आपको एक थ्रेड शुरू करने के लिए एक विशिष्ट निर्देश नहीं देती है, बल्कि यह जादुई रूप से इसे स्टार्ट () विधि पर लागू करती है।
  • थ्रोबल - सभी वर्गों की जड़ जो थ्रो, थ्रो और कैच के साथ-साथ एक्सेप्शन बनाम रनटाइम एक्ससेप्शन और एरर की कंपाइलर समझ के साथ काम कर सकती है।
  • NullPointerException और अन्य अपवाद जैसे कि ArrayIndexOutOfBounds जो एथेरो की तुलना में अन्य bytecode निर्देशों द्वारा फेंका जा सकता है।

इंटरफेस

  • Iterable - एकमात्र इंटरफ़ेस जिसे लूप के लिए एन्हांस किया जा सकता है

माननीय उल्लेख:

  • java.lang.reflect। ऐरे - क्लास ऑब्जेक्ट द्वारा परिभाषित एक नया एरे तैयार करना संभव नहीं होगा।
  • एनोटेशन वे एक विशेष भाषा सुविधा है जो रनटाइम पर एक इंटरफ़ेस की तरह व्यवहार करती है। आप निश्चित रूप से दूसरे एनोटेशन इंटरफ़ेस को परिभाषित नहीं कर सकते, जैसे आप ऑब्जेक्ट के लिए प्रतिस्थापन को परिभाषित नहीं कर सकते। हालाँकि, आप उनकी सभी कार्यक्षमता को कार्यान्वित कर सकते हैं और प्रतिबिंब के बजाय उन्हें (और बॉयलरप्लेट का एक पूरा गुच्छा) पुनः प्राप्त करने का एक और तरीका है। वास्तव में, एनोटेशन पेश किए जाने से पहले कई XML आधारित और javadoc टैग आधारित कार्यान्वयन थे।
  • ClassLoader - यह निश्चित रूप से JVM के साथ एक विशेषाधिकार प्राप्त संबंध है क्योंकि एक कक्षा को लोड करने के लिए कोई भाषा तरीका नहीं है, हालांकि एक बाईटेकोड तरीका है, इसलिए यह उस तरह से ऐरे की तरह है। इसे जेवीएम द्वारा वापस बुलाए जाने का विशेष विशेषाधिकार भी है, हालांकि यह एक कार्यान्वयन विवरण है।
  • सीरियल करने योग्य - आप प्रतिबिंब के माध्यम से कार्यक्षमता को लागू कर सकते हैं, लेकिन इसका अपना विशेषाधिकार प्राप्त कीवर्ड है और आप कुछ परिदृश्यों में SecurityManager के साथ अंतरंग होने में बहुत समय बिताएंगे।

नोट: मैंने जेएनआई (जैसे कि आईओ) प्रदान करने वाली सूची की चीजों को छोड़ दिया क्योंकि आप हमेशा अपने स्वयं के जेएनआई कॉल को लागू कर सकते थे यदि आप इतने इच्छुक थे। हालाँकि, जेवीएम के साथ विशेषाधिकार प्राप्त तरीकों से बातचीत करने वाली देशी कॉल अलग-अलग हैं।

ऐरे बहस करने योग्य हैं - वे ऑब्जेक्ट वारिस करते हैं, उनके पास एक समझदार पदानुक्रम है (ऑब्जेक्ट [] स्ट्रिंग का एक सुपरस्क्रिप्ट है]], लेकिन वे एक भाषा सुविधा है, न कि अपने आप में एक परिभाषित वर्ग।


@ डोनल, बहुत सच है, मैं रनटाइम एनोटेशन के बारे में सोच रहा था, लेकिन स्रोत स्तर के एनोटेशन वास्तव में इस तरह से किए गए थे (xdoclet सबसे उल्लेखनीय रूप से, या यहाँ तक कि कोरड जावा में @deprecated के साथ)
Yishai

मैं बस कोड की एक मोटी परत के माध्यम से अपना रास्ता लड़ रहा हूं जो मूल रूप से xdoclet प्रसंस्करण के साथ लिखा गया था और फिर एनोटेशन में बदल दिया गया था। ओह, मैं कैसे एनोटेशन को पसंद करता हूं (भले ही उपयुक्त मैवेन भस्म के साथ, शुद्ध प्रभाव समान हो)।
डोनल फैलो

@ KK_07k11A0585, कलेक्शंस एक मानक एपीआई है जो किसी के द्वारा एक अलग तरीके से बनाया जा सकता है (वास्तव में वैकल्पिक कार्यान्वयन हैं जो कि आदिम के आसपास तैयार किए जाते हैं, साथ ही साथ एक बहुत ही प्रसिद्ध Google परियोजना जो उन्हें बढ़ाती है)। केवल एक चीज उन्हें मिलती है जो विशेष है Iterable, जिसका उत्तर में उल्लेख किया गया है। वे जावा प्रोग्रामिंग की रोटी और मक्खन हैं, यह सुनिश्चित करने के लिए, लेकिन वे केवल नियमित कक्षाएं हैं, जिसमें कोई विशेष विशेषाधिकार नहीं हैं।
यिशै

@Yishai किसी भी एप्लिकेशन को विकसित करते समय, प्रमुख बात जो महत्वपूर्ण होती है वह है डेटा प्रबंधन। हम सभी अलग-अलग तरीकों से एक कार्य कर सकते हैं, लेकिन अनुकूलित तरीका वह है जो कम स्मृति रखता है और जिसमें अनावश्यक संदर्भों का कम उपयोग होता है। संग्रह का उपयोग करके हम बड़ी मात्रा में डेटा को सॉर्ट, खोज, और तुलना कर सकते हैं, जो द्विआधारी खोज, मर्ज सॉर्ट आदि जैसे पूर्वनिर्धारित एल्गोरिदम प्रदान करता है। यह हमें हमारी तकनीकों को अनुकूलित करने के लिए तुलनित्र और तुलनात्मक इंटरफेस भी प्रदान करता है। कलेक्शन क्लास जावा में सबसे अच्छी क्लास नहीं हो सकती है, लेकिन यह निस्संदेह महिमामंडित गुणों का वर्ग है।
केके_ ०11११ ए ०५K५

1
किस बारे में SecurityManager? या प्रतिबिंब या क्रमांकन से संबंधित कुछ भी?
एंटीमनी

19

Class, बेशक। इसका अपना शाब्दिक अर्थ है (यह एक अंतर जिसे इसके साथ शेयर किया गया है String, BTW) और यह सब उस प्रतिबिंब जादू का शुरुआती बिंदु है।


आह, अच्छी बात है। तो एक वर्ग शाब्दिक का एक उदाहरण क्या है? क्या आप MyClass.class का जिक्र कर रहे हैं?
एयरोबे

4
@aioobe: बिल्कुल। ध्यान दें कि आपके पास int.class, char.class इत्यादि भी हैं
माइकल


12
  1. Enum। आपको इसे उप-करने की अनुमति नहीं है, लेकिन संकलक कर सकता है।
  2. Java.util.concurrent के तहत कई चीजें JVM समर्थन के बिना लागू की जा सकती हैं, लेकिन वे बहुत कम कुशल होंगी।

1
आप गुमनाम रूप से उपवर्ग एनमों (जो विज़ुअल्स पैटर्न का आधार है, एनम वैल्यूज़ के लिए) कर सकते हैं। लेकिन हाँ, आप पूरी तरह से एक एनम ;-) को पूरी तरह से उप-वर्ग नहीं कर सकते हैं
थियरी

11

ऑटोबॉक्सिंग के रूप में सभी संख्या वर्गों में थोड़ा सा जादू है ।


आपका मतलब उन वर्गों से है जो आदिम को लपेटते हैं - जिसमें बुलियन और चरित्र भी शामिल हैं; लेकिन BigInteger को बाहर करता है।
एमोरी

1
@emory: ठीक है, बस आदिम आवरण वर्ग। दुर्भाग्य से यह BigInteger को बाहर करता है।
छिपकली

10

चूंकि महत्वपूर्ण वर्गों का उल्लेख किया गया था, मैं कुछ इंटरफेस का उल्लेख करूंगा:

Iterableइंटरफेस (1.5 के बाद से) - यह एक वस्तु एक foreach पाश में भाग लेने के लिए अनुमति देता है:

Iterable<Foo> iterable = ...;
for (Foo foo : iterable) {

}

Serializableइंटरफ़ेस एक बहुत ही खास अर्थ है, एक मानक इंटरफ़ेस से अलग है। आप उन तरीकों को परिभाषित कर सकते हैं जो इंटरफ़ेस में (जैसे readResolve()) परिभाषित नहीं होने पर भी ध्यान में रखा जाएगा । transientकीवर्ड के व्यवहार को प्रभावित है कि भाषा तत्व है Serializableकार्यान्वयन।


सच है, वे हालांकि इंटरफेस हैं, इसलिए उन्हें प्रति देखने के लिए "विशेष" कार्यान्वयन की आवश्यकता नहीं है। (थ्रोबेबल के समान।)
aioobe

वास्तव में सीरियल को विशेष कार्यान्वयन की आवश्यकता होती है। यह एक ऐसा इंटरफ़ेस है जिसकी आपसे दो विधियाँ होने की उम्मीद है (मैं नाम भूल जाता हूँ ... मैं इसे गूगल कर सकता हूँ ...) लेकिन वे आवश्यक नहीं हैं या मानक इंटरफ़ेस योजना में परिभाषित नहीं हैं।
corsiKa

@glowcoder: हालांकि, एक बार यह तर्क दिया जा सकता है कि Serializable की सभी विशिष्टता जावा भाषा के लिए प्रासंगिक नहीं है, केवल ObjectOutputStream और ObjectInputStream के कार्यान्वयन के लिए।
माइकल बोर्गवर्ड


1
मुझे ऐसा नहीं लगता - Comparableकिसी भी आंतरिक चीज़ में भाग नहीं लेता। आप आसानी से एक ही कार्यक्षमता के साथ लिख सकते हैं NewComparableऔर नए हैंNewArrays.sort(..)
Bozho

6
  1. थ्रोबल , रनटाइम एक्सेप्शन , एरर एश्योरियन एरर
  2. संदर्भ WeakReference, SoftReference, PhantomReference
  3. enum
  4. टिप्पणी

अच्छी सूची है। +1, एनोटेशन हालांकि एक इंटरफ़ेस है, और इसका कोई कार्यान्वयन नहीं है।
aioobe

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



2

इस बारे में निश्चित नहीं है। लेकिन मैं IO ऑब्जेक्ट्स को मैन्युअल रूप से लागू करने का तरीका नहीं सोच सकता।


आप सही हैं, उन्हें शुद्ध जावा में लागू नहीं किया जा सकता। उन्हें जेएनआई के माध्यम से लागू करने की आवश्यकता है (बस किसी अन्य वर्ग की तरह जिसे सिस्टम कॉल करने की आवश्यकता है)। हालांकि इसके अलावा, उन्हें संकलक या जेवीएम से किसी विशेष समर्थन की आवश्यकता नहीं है।
aioobe

2

Systemक्लास में कुछ जादू है ।

System.arraycopy देशी कोड में एक हुक है

public static native void arraycopy(Object array1, int start1, 
  Object array2, int start2, int length);

परंतु...

/**
 * Private version of the arraycopy method used by the jit
 * for reference arraycopies
 */
private static void arraycopy(Object[] A1, int offset1,
  Object[] A2, int offset2, int length) {
   ...
}

1
अरे, जवाब के अपने दूसरे भाग से आपका क्या मतलब है?
पेसियर

1

खैर जब से मुखर की विशेष हैंडलिंग का उल्लेख किया गया है। यहाँ कुछ और अपवाद प्रकार हैं जिनका jvm द्वारा विशेष उपचार है:

  • शून्य सूचक अपवाद
  • ArithmeticException।
  • StackOverflowException
  • सभी प्रकार के OutOememoryErrors
  • ...

अपवाद विशेष नहीं हैं, लेकिन jvm उन्हें विशेष मामलों में उपयोग करता है, इसलिए आप उन्हें स्वयं अपना jvm लिखे बिना लागू नहीं कर सकते। मुझे यकीन है कि आसपास कुछ और विशेष अपवाद हैं।


0

उन वर्गों में से अधिकांश वास्तव में संकलक या जेवीएम की 'विशेष' मदद से लागू नहीं होते हैं। ऑब्जेक्ट कुछ मूल निवासी को पंजीकृत करता है जो आंतरिक जेवीएम संरचनाओं के आसपास प्रहार करता है, लेकिन आप इसे अपनी कक्षाओं के लिए भी कर सकते हैं। (मैं मानता हूं कि यह शब्दार्थ के अधीन है, "जेवीएम में परिभाषित एक देशी कॉल" को विशेष वीवीवी समर्थन के रूप में माना जा सकता है।)

Is नया ’का व्यवहार क्या है / विशेष है, और इन आंतरिक संरचनाओं को शुरू करने के तरीके में how फेंक’ निर्देश हैं।

एनोटेशन और संख्या बहुत अधिक ऑल-आउट अजीब हैं, हालांकि।


4
aioobe से तात्पर्य उन कक्षाओं से है जिनसे आप स्वयं को कार्यान्वित नहीं कर सकते, क्योंकि उनके पास समर्थन में विशेष निर्माण है। आप प्रपत्र java.lang.Object को इनहेरिट किए बिना प्रकार सिस्टम के रूट के रूप में अपना ऑब्जेक्ट क्लास नहीं बना सकते। ऑब्जेक्ट को संकलक और जेवीएम दोनों से विशेष समर्थन है, यह सुनिश्चित करने के लिए कि यह एक जड़ वर्ग है। इसके चारों ओर देशी कॉल पर्याप्त नहीं हैं।
जोसेफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.