ऐसे प्रश्न के साथ, एससीजेपी परीक्षा छिपाने के बारे में आपके ज्ञान का आकलन कर रही है। परीक्षक जानबूझकर जटिल चीजें आपको यह विश्वास करने के लिए प्रयास करते हैं कि कार्यक्रम का व्यवहार केवल बहुरूपता पर निर्भर करता है, जो ऐसा नहीं करता है।
चलिए चीजों को थोड़ा स्पष्ट बनाने की कोशिश करते हैं क्योंकि हम addFive()
विधि को हटाते हैं।
class Foo {
public int a = 3;
}
class Bar extends Foo {
public int a = 8;
}
public class TestClass {
public static void main(String[]args) {
Foo f = new Bar();
System.out.println(f.a);
}
}
अब चीजें थोड़ा कम भ्रमित हैं।main
विधि Foo
प्रकार का एक चर घोषित करता है, जिसे रनटाइम पर Bar
प्रकार का ऑब्जेक्ट सौंपा गया है। यह Bar
Foo
से विरासत के बाद से संभव है। कार्यक्रम के बाद Foo
प्रकार के चर के सार्वजनिक क्षेत्र a
को संदर्भित किया जाता है।
यहां त्रुटि यह माननी होगी कि ओवरराइडिंग के समान ही अवधारणा वर्ग फ़ील्ड पर लागू होती है। लेकिन वहाँ क्षेत्रों के लिए कोई इस तरह के एक अवधारणा है: सार्वजनिक क्षेत्र वर्ग Bar
की a
वर्ग Foo
की सार्वजनिक क्षेत्र a
नहीं अधिभावी है, लेकिन यह क्या छुपा कहा जाता है। जैसा कि नाम का तात्पर्य है, इसका मतलब है कि कक्षा Bar
, a
के दायरे में Bar
का स्वयं का फ़ील्ड देखें, जिसका Foo
के साथ कुछ लेना देना नहीं है। (JLS 8.4.8 - Inheritance, Overriding, and Hiding)
तो, जब हम f.a
लिख रहे हैं, तो a
क्या हम इसका जिक्र कर रहे हैं? याद रखें कि क्षेत्र a
ऑब्जेक्ट f
के घोषित प्रकार का उपयोग करके Foo
पर संकलित समय पर किया गया है। नतीजतन, कार्यक्रम '3' प्रिंट करता है।
अब, Foo
में addFive()
विधि जोड़ें और इसे परीक्षा प्रश्न के रूप में कक्षा Bar
में ओवरराइड करें। यहां polymorphism लागू होता है, इसलिए कॉल f.addFive()
संकलन समय का उपयोग नहीं किया जाता है लेकिन ऑब्जेक्ट f
का रनटाइम प्रकार, जो Bar
है, और इस प्रकार 'बी' मुद्रित किया जाता है।
लेकिन अभी भी कुछ समझना चाहिए: क्यों क्षेत्र a
, जो 5 इकाइयों द्वारा बढ़ाया गया था, अभी भी मूल्य '3' पर चिपक गया है? यहां छिपा आसपास खेल रहा है। चूंकि यह वर्ग Bar
की विधि है जिसे कॉल किया जाता है, और क्योंकि Bar
में, प्रत्येक a
Bar
के सार्वजनिक क्षेत्र a
को संदर्भित करता है, यह वास्तव में Bar
फ़ील्ड है जो वृद्धि हुई है।
1) अब, एक सहायक प्रश्न: कैसे हम Bar
के सार्वजनिक क्षेत्र a
main
विधि से एक्सेस कर सकता है?
System.out.println(((Bar)f).a);
जो संकलक मजबूर f
Bar
के रूप में की a
क्षेत्र के क्षेत्र सदस्य a
को हल करने: हम ऐसा ही कुछ के साथ क्या कर सकते हैं।
यह हमारे उदाहरण में 'बी 13' प्रिंट करेगा।
2) फिर भी एक और सवाल: हम कैसे काम कर सकता था चारों ओर वर्ग Bar
की addFive()
विधि Bar
के a
क्षेत्र के लिए, लेकिन इसके सुपर क्लास eponimous क्षेत्र के लिए नहीं उल्लेख करने में छुपा?
public void addFive() {
super.a += 5;
System.out.print("b ");
}
यह हमारे उदाहरण में '8 बी' प्रिंट होगा: बस क्षेत्र संदर्भ के सामने super
कीवर्ड जोड़ने काम कर देता है।
ध्यान दें कि प्रारंभिक वक्तव्य
public void addFive() {
this.a += 5;
System.out.print("b ");
}
को परिष्कृत किया जा सकता है क्योंकि जब संकलक क्षेत्र a
को हल है, यह भीतर से निकटतम enclosing दायरे में देखने के लिए शुरू कर देंगे विधि addFive()
, और Bar
वर्ग उदाहरण मिल जाए, पर स्पष्ट रूप this
उपयोग करने के लिए की आवश्यकता को समाप्त।
लेकिन, ठीक है, this
शायद इस परीक्षा के प्रश्न हल करने के लिए परीक्षार्थी के लिए एक सुराग था!
यह वह जगह है SCJP संबंध में भी प्रश्न, है ना? –
हाँ @PrakharMohan क्या आप भी इसके लिए दिखाई दिए हैं ??? मैं अभी तक ... :) –