जावा में ऑब्जेक्ट क्लास से इनहेरिट करें


157

क्या Objectजावा में वर्ग से वंशानुक्रम में अंतर होता है ?

यदि नहीं, तो कैसे हम इंटरफ़ेस उदाहरण पर ऑब्जेक्ट क्लास की विधि को कॉल करने में सक्षम हैं

public class Test {
    public static void main(String[] args) {
        Employee e = null;
        e.equals(null);
    }
}

interface Employee {
}

56
+1, उत्कृष्ट प्रश्न।
एरियोब

@ ईजेपी, तकनीकी रूप से यह बात नहीं करता है कि जावा / io / Serializable.class में क्या है। मुझे लगता है कि आप जावा लैंग स्पेक को जेवीएम कल्पना के साथ भ्रमित कर रहे हैं।
एरियोब

@aioobe जैसा कि मैंने उन विशिष्टताओं में से किसी का भी उल्लेख नहीं किया है जिन्हें मैं आपकी बात नहीं समझता। Serializableएक इंटरफ़ेस है, सबसे सरल संभव; इस पर चलने से javapआपको पता चलता है कि इसे क्या विरासत में मिला है; और यह जावा भाषा विनिर्देश द्वारा तय किया गया है। अगर आपको लगता है कि JVM Spec इसमें आता है तो कृपया हमें बताएं।
लोर्ने

2
@ ईजेपी, सवाल जावा भाषा (यानी जावा भाषा विनिर्देश) के बारे में है। क्या कभी java / io / Serializable.class में JVM कल्पना क्या कहती है से संबंधित है। तकनीकी रूप से यह कहने की कोई गारंटी नहीं है कि दो विशिष्टताओं की विशेषताओं के बीच एक-से-एक पत्राचार है।
aioobe

मैंने हालिया ब्लॉग पोस्ट में इस पर विस्तार से बताया ।
aioobe

जवाबों:


161

क्या Objectजावा में वर्ग से वंशानुक्रम में अंतर होता है ?

नहीं, वे नहीं करते। और कोई आम "जड़" इंटरफ़ेस नहीं है जो उस मामले के लिए या तो (सभी वर्गों के मामले में) इंटरफेस के द्वारा विरासत में मिला है। (*)

यदि नहीं, तो कैसे हम इंटरफ़ेस उदाहरण पर ऑब्जेक्ट क्लास की विधि को कॉल करने में सक्षम हैं

प्रत्येक सार्वजनिक विधि के लिए एक इंटरफ़ेस ने स्पष्ट रूप से एक विधि घोषित की है Object। इस प्रकार equalsविधि को स्पष्ट रूप से एक इंटरफ़ेस में एक सदस्य के रूप में घोषित किया जाता है (जब तक कि यह पहले से ही एक सुपरनोटफेस से विरासत में नहीं मिलता है)।

यह जावा लैंग्वेज स्पेसिफिकेशन,। 9.2 इंटरफेस मेंबर्स के बारे में विस्तार से बताया गया है ।

9.2 इंटरफ़ेस सदस्य

[...]

  • एक अंतरफलक कोई सीधा superinterfaces है, तो इंटरफ़ेस परोक्ष एक सार्वजनिक सार सदस्य विधि वाणी मीटर हस्ताक्षर के साथ रों , वापसी प्रकार आर , और खंड फेंकता टी हस्ताक्षर के साथ प्रत्येक सार्वजनिक दृष्टांत विधि मीटर करने के लिए इसी रों , वापसी प्रकार आर , और खंड फेंकता टी घोषित किया जाता हैObject , जब तक कि एक ही हस्ताक्षर, एक ही वापसी प्रकार और एक संगत थ्रो क्लॉज वाली एक विधि स्पष्ट रूप से इंटरफ़ेस द्वारा घोषित नहीं की जाती है।

[...]


इस पोस्ट को यहाँ एक लेख के रूप में फिर से लिखा गया है


(*) ध्यान दें कि एक उपप्रकार होने की धारणा विरासत से समतुल्य नहीं है : कोई सुपर इंटरफ़ेस वाले इंटरफेस वास्तव में Object(10 4.10.2 के सबटाइप होते हैं। वर्ग और इंटरफ़ेस प्रकारों के बीच घटाव ) भले ही वे विरासत से नहीं हैं Object


1
@aioobe यदि हम किसी भी इंटरफ़ेस को लागू करते हैं, तो हम उस इंटरफ़ेस को लागू करने वाले वर्ग में "समान" पद्धति को लागू करने के लिए क्यों नहीं देते हैं। मेरी अवधारणाओं के अनुसार, हमें कक्षा को लागू करने में इंटरफ़ेस के तरीकों को लागू करना होगा अन्यथा वर्ग अमूर्त होगा।
विकास मंगल

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

3
मुझे यहां बात समझ आ गई। लेकिन एक सवाल- हमें इसकी आवश्यकता क्यों है? यदि Objectइंटरफ़ेस में कक्षा के तरीकों को घोषित नहीं किया गया होता तो क्या अंतर होता ?
मंगल पर विकास मंगल

2
यदि हमारे पास यह नहीं था, तो प्रश्न में कार्यक्रम संकलित नहीं होगा। इंटरफ़ेस equalsमें विधि पर Employeeहै।
एरियोबे

1
यह सवाल और जवाब मुझे अभी भी याद दिलाता है कि अनुभव के बाद भी मुझे अपने बेसिक्स को मजबूत बनाने पर ध्यान देना चाहिए।
आनंद जी कढ़ी

13

Object किसी भी इंटरफ़ेस का एक सुपरस्क्रिप्ट है [1]

हालांकि, एक अंतरफलक नहीं है implements, extendsया, "से विरासत" Object

JLS को Objectइंटरफेस में विधियों को जोड़ने के लिए एक विशेष खंड है [2]

[१] http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.10.2

[२] http://java.sun.com/docs/books/jls/third_edition/html/interfaces=##.2


यह सबसे सटीक उत्तर है। स्वीकार किया जाना चाहिए। उदाहरण के लिए, एक विधि जो java.lang.Objectकिसी भी इंटरफ़ेस प्रकार के संदर्भ को स्वीकार करेगी। इसके अलावा आप Objectकिसी भी संकलक त्रुटि के बिना स्पष्ट रूप से इंटरफ़ेस कास्ट कर सकते हैं ।
14

12

प्रत्येक .classफ़ाइल में वास्तव में एक सुपरक्लास क्षेत्र होता है , जिसमें वे इंटरफेस शामिल होते हैं।

एक इंटरफ़ेस के लिए यह हमेशा इंगित करता है java.lang.Object। लेकिन इसका इस्तेमाल किसी भी चीज के लिए नहीं किया जाता है।

इसे देखने का एक और तरीका है:

interface MyInterface {
    // ...
}

public myMethod(MyInterface param) {
    Object obj = (Object) param;
    // ...
}

यहां कास्ट (Object) paramहमेशा मान्य होता है, जिसका अर्थ है कि प्रत्येक इंटरफ़ेस प्रकार का एक उपप्रकार है java.lang.Object


4
.Class फ़ाइल .java फ़ाइल की एक कलाकृति है। परिणामी .class फ़ाइल को देखकर जावा भाषा में कुछ काम करने का तर्क देने के लिए तर्क करना पिछड़े तर्क है।
aioobe

वस्तु obj = (ऑब्जेक्ट) परम; संकलन त्रुटि नहीं है। लेकिन MyInterface के तरीके (सार्वजनिक) obj के लिए दृश्यमान नहीं हैं। इसलिए यह नहीं माना जा सकता है कि MyInterface हर इंटरफ़ेस प्रकार java.lang.Object का उप-प्रकार है
सबरीनाथन u

5

ऐसा इसलिए employee e = ...है क्योंकि पढ़ता है कि एक वर्ग है जो लागू करता है employee , और चर को सौंपा गया है e। प्रत्येक वर्ग जो एक इंटरफ़ेस को लागू करता है, वस्तु का व्यापक रूप से विस्तार करता है, इसलिए जब आप करते हैं e.equals(null), तो भाषा जानती है कि आपके पास एक वर्ग है जो इसका उप-प्रकार है employee

JVM आपके कोड (यानी थ्रो NullPointerException) के लिए रनटाइम चेकिंग करेगा ।


उत्तर नामकरण सम्मेलनों का पालन करना चाहिए।
लेव बलोच

3

क्या इंटरफ़ेस विरासत ऑब्जेक्ट क्लास है, हम इंटरफ़ेस प्रकार के संदर्भ के माध्यम से ऑब्जेक्ट क्लास के तरीकों तक कैसे पहुंच सकते हैं
कोई इंटरफ़ेस Objectक्लास को विरासत में नहीं देता है , लेकिन यह Objectक्लास के सभी तरीकों को एक्सेसिबिलिटी प्रदान करता है । एक इंटरफ़ेस के सदस्य हैं:

Those members declared in the interface.
Those members inherited from direct superinterfaces.
If an interface has no direct superinterfaces, then the interface implicitly 

Objectकक्षा में घोषित प्रत्येक सार्वजनिक उदाहरण विधि के अनुरूप सार्वजनिक सार सदस्य विधि घोषित करता है
यह एक संकलन-समय की त्रुटि है यदि इंटरफ़ेस स्पष्ट रूप से इस तरह की विधि m को उस स्थिति में घोषित करता है जिसमें m को घोषित किया finalजाता है Object

अब यह स्पष्ट है कि सभी सुपरनोटफेस में घोषित abstractप्रत्येक publicउदाहरण विधि के अनुरूप सदस्य विधि है Object

स्रोत: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html


0

किसी भी इंटरफ़ेस को लागू करने वाला कोई वर्ग Objectपरिभाषा के अनुसार भी होता है ।


0

" संदर्भ प्रकार सभी java.lang.Object से विरासत में मिलते हैं । कक्षाएं, एनम, सरणियां और इंटरफेस सभी प्रकार के होते हैं। "

से उद्धृत: http://docs.oracle.com/javase/tutorial/reflect/class/index.html स्पष्ट होने के लिए दूसरा वाक्य।


Classes, enums, and arrays (which all inherit from java.lang.Object) as well as interfaces are all reference types: यह नहीं कहता कि इंटरफ़ेस ऑब्जेक्ट से विरासत में मिला है। केवल क्लास, एनम और एरे।
नंबर 945

उन्होंने इसे बदल दिया :)
dalvarezmartinez1

यहां तक ​​कि अगर "उन्होंने इसे बदल दिया" (जो मुझे संदेह है), तो ट्यूटोरियल गलत हो सकता है। मानक संदर्भ जावा भाषा विनिर्देश (JLS) है।
लेव बलोच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.