2011-06-03 13 views
44

सामान्य रूप से, क्या एक निजी वर्ग को स्थैतिक घोषित करने में कोई लाभ है?मैं अपनी निजी कक्षा स्थिर कब बनाना चाहूंगा?

मैं किस मामले में दूसरे में से एक का उपयोग करना चाहता हूं?

private static class Foo 
{ 
    ... 
} 

बनाम

private class Foo 
{ 
    ... 
} 
+1

[जावा-भीतरी-वर्ग-और स्थैतिक-नेस्टेड श्रेणी] (http:

public abstract class AbstractClass <T> { private void doSomethingOrThrowException() throws SpecificException { .... if (! successful) { throw new SpecificException(); } } private static class SpecificException extends Exception {} } 

अगर मैं स्थिर बाहर छोड़ने के लिए थे, संकलक मुझे एक त्रुटि है जो यह बताता देना होगा : //stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class) शायद सहायक हो सकता है। – MockerTim

+0

आपको इस पोस्ट में दूसरा उत्तर उपयोगी मिल सकता है: http://stackoverflow.com/questions/1844355/java-static-class – gwood

उत्तर

2

आप सदस्य चर के लिए उपयोग की जरूरत है/संलग्नित क्लास के तरीकों, गैर स्थिर फार्म का उपयोग करें। यदि आप नहीं करते हैं, तो स्थिर रूप का उपयोग करें।

+1

यह खराब जवाब है। एक स्थिर वर्ग से भी, यदि मैं अभिभावक वर्ग की वस्तु का संदर्भ प्राप्त करता हूं, तो मैं निजी सदस्यों तक पहुंच सकता हूं। –

+0

लेकिन आप क्यों? यदि आपको निजी चरों तक पहुंच की आवश्यकता है और यह एक आंतरिक वर्ग है, तो इसे स्थिर बनाने और माता-पिता के संदर्भ को पारित करने के बजाय इसे गैर-स्थैतिक बनाएं। –

+0

वे अलग-अलग अवधारणाएं हैं। गैर स्थैतिक (यानीआंतरिक) कक्षाओं में अभिभावक वर्ग की वस्तु का निहित संदर्भ है। इसलिए, यदि अभिभावक वर्ग की कोई वस्तु नहीं है तो आपके भीतर आंतरिक वर्ग का ऑब्जेक्ट नहीं हो सकता है। इसका एक उदाहरण Map.Entry (या बेहतर Iterator) होगा - इसे मूल मानचित्र ऑब्जेक्ट के संदर्भ की आवश्यकता है। स्टेटिक नेस्टेड क्लास का एक उदाहरण बिल्डर होगा, इसे माता-पिता के निजी कन्स्ट्रक्टर –

-1

स्थैतिक वर्ग केवल सामान्य कक्षाओं से भिन्न होते हैं जिसमें इन्हें उनके उदाहरणों के बिना एक्सेस किया जा सकता है। इसलिए यदि आपको हर कक्षा में हर समय पहुंच योग्य होने की आवश्यकता है, तो स्थिर

+2

मुझे नहीं लगता कि उसने पूछा कि स्थिर वर्ग क्या है .. – BBdev

1

का उपयोग करें, मुझे लगता है कि आप आंतरिक कक्षाओं का जिक्र कर रहे हैं।

मुझे लगता है कि प्रेरणा आपके आंतरिक वर्ग को कैसे जोड़ना चाहती है। यदि आप अपनी आंतरिक कक्षा को अपने बाहरी वर्ग के विशिष्ट उदाहरण से जोड़ना चाहते हैं, तो आप private class का उपयोग करेंगे, अन्यथा, private static class का उपयोग करें।

+0

मुझे पूरा यकीन है कि 'निजी' और "आंतरिक" कक्षाएं समानार्थी हैं। –

27

मुझे लगता है कि यह एक अच्छा प्रारंभिक बिंदु है: http://java67.blogspot.fi/2012/10/nested-class-java-static-vs-non-static-inner.html

1) नेस्ट स्थिर वर्ग बाहरी वर्ग लेकिन गैर स्थिर नेस्टेड वर्ग या इनर वर्ग के संदर्भ की जरूरत नहीं है बाहरी वर्ग संदर्भ की आवश्यकता है। आप बाहरी कक्षा के उदाहरण के बिना इनर क्लास का उदाहरण नहीं बना सकते हैं। पर नेस्टेड क्लास स्थिर या गैर स्थैतिक बनाते समय यह सबसे महत्वपूर्ण बात है।

2) स्थैतिक वर्ग वास्तव में कक्षा का स्थिर सदस्य है और स्थिर संदर्भ उदा। बाहरी वर्ग की स्थैतिक विधि या स्थैतिक ब्लॉक।

3) स्थैतिक और गैर स्थैतिक घोंसला वर्ग के बीच एक और अंतर है कि आप गैर स्थिर सदस्यों तक नहीं पहुंच सकते हैं उदा। नेस्टेड स्थैतिक कक्षा में विधि और फ़ील्ड सीधे। यदि आप करते हैं तो आपको "गैर स्थिर सदस्य का उपयोग स्थिर संदर्भ में नहीं किया जा सकता है"। जबकि इनर क्लास बाहरी कक्षा के स्थिर और गैर स्थिर सदस्य दोनों तक पहुंच सकता है।

+2

यह स्वीकार्य उत्तर होना चाहिए। – Dave

+0

लेकिन, हमने 'निजी 'का उपयोग किया है, क्या यह अभी भी पहुंच योग्य होगा? –

+1

यह केवल घोंसले के वर्ग के भीतर पहुंच योग्य होगा और नजदीकी दुनिया के बाहर नहीं होगा क्योंकि यह निजी रूप से घोंसले के वर्ग के लिए है –

0

मुझे एक सामान्य सार वर्ग में एक विशिष्ट अपवाद होने में उपयोगी पाया गया। अर्थात्: The generic class AbstractClass<T>.SpecificException may not subclass java.lang.Throwable