मुझे समझ में क्यों वर्ग के सदस्यों की पहुंच के बीच एक अंतर है जब कंस्ट्रक्टर्स के बारे में बोलकर देखें।जावा निजी कंस्ट्रक्टर्स दृश्यता
निम्न उदाहरण पर विचार करें:
class A {
static class B {
private B(String s) {}
private void foo() {}
}
static class C extends B {
public C(String s) {
super(s); // call B(String), which is private, and obviously accessible
}
void bar() {
foo(); // compilation error (symbol unknown), as B.foo() is private
}
}
}
A
की निजी सदस्यों, निजी होने के रूप में, B
से सुलभ नहीं होना चाहिए। खेतों और तरीकों के लिए, यह मामला है, लेकिन यह है कि निर्माताओं के एक ही नियम का पालन नहीं कर रहे हैं लगता है।
JLS-8 (6.6.1. Determining Accessibility) से, हम पढ़ सकते हैं:
[...]
एक सदस्य एक संदर्भ प्रकार के (वर्ग, इंटरफ़ेस, क्षेत्र, या विधि), या एक वर्ग के प्रकार के एक निर्माता, पहुँचा जा सकता है केवल तभी प्रकार पहुँचा जा सकता है और सदस्य या निर्माता का उपयोग की अनुमति के लिए घोषित किया जाता है:
- ,210
[...]
अन्यथा, सदस्य या निर्माता
private
घोषित किया जाता है, और यदि और केवल यदि यह शीर्ष स्तर वर्ग के शरीर के भीतर होता है (§7.6) कि सदस्य या निर्माता की घोषणा encloses पहुँच अनुमति दी है।
किसी को भी मुझे बता सकते हैं क्यों निर्माता C
से पहुँचा जा सकता है, यहां तक कि घोषित किया गया private
जबकि?
सिर्फ इसलिए कि आप सुपर कॉल कर सकते हैं इसका मतलब यह नहीं है कि कन्स्ट्रक्टर पहुंच योग्य है – michaelsnowden
क्या कोई मुझे बता सकता है कि कन्स्ट्रक्टर सी से क्यों पहुंचा जा सकता है, भले ही निजी घोषित किया जा सके? -> क्योंकि बी और सी दोनों आंतरिक कक्षाएं हैं। यदि आप बी और सी को ए –
@ जोर्नबुइटिंक के बाहर ले जाते हैं तो अब और काम नहीं करेंगे: यदि ऐसा है, तो 'foo()' * * * क्यों उपलब्ध नहीं है? यहां एक असंगतता प्रतीत होती है। –