2013-06-05 8 views
5

मैं जेनेरिक कक्षाओं के बारे में पूछना चाहता हूं। क्या होता है जब मैं एक सामान्य वर्ग से दो ऑब्जेक्ट उदाहरण बना देता हूं। क्या वे हर स्थिर सदस्यों को साझा करते हैं, या दोनों के अपने स्थिर सदस्य हैं?क्या सामान्य वर्ग स्थिर सदस्य साझा करते हैं?

इसलिए उदाहरण के लिए:

public A<?>(){ 
    public static Integer member = 0; 
} 

A<Integer> integer = new A<Integer>(); 
A<String> string = new A<String>(); 

दोनों Integer करो और Stringmember के पीछे एक ही संदर्भ है?

+2

आपका प्रश्न मान्य है, लेकिन आपके द्वारा पोस्ट किया गया कोड खराब है: यह न तो एक वैध निर्माता है, न ही एक वर्ग घोषणा है। आपके प्रश्न का उत्तर यह है: हां, वे प्रत्येक स्थैतिक सदस्य को साझा करते हैं। साथ ही, आप स्वयं प्रश्न का उत्तर दे सकते हैं: 'System.out.println (integer.member == string.member); 'System.out.println (एमेम्बर == एमेम्बर) जैसा ही है;' 'स्थिर 'होने के कारण) – jlordo

+0

परीक्षण करना मुश्किल नहीं है ... – Dukeling

+0

यदि सदस्य स्वयं सामान्य है तो क्या होता है? 'पब्लिक क्लास माई क्लास {सार्वजनिक स्थैतिक टी सदस्य की तरह; } '?? –

उत्तर

10
public class A<T>{ 
    public static Integer member = 0; 

    public static void main(String[] args) 
    { 
     A<Integer> integer = new A<Integer>(); 
     A<String> string = new A<String>(); 

     integer.member++; 
     System.out.println(string.member); 
    } 
} 

आउटपुट

1 

तो, हाँ दो उदाहरणों में एक ही member चर को साझा करें।

+2

+1 प्रश्न के लिए अच्छा उदाहरण है। यह भी ध्यान देने योग्य है कि 'integer.member ++;' खराब शैली है, और स्टाइलशेकर इस तरह कोड को हतोत्साहित करते हैं। 'स्थैतिक 'सदस्यों को हमेशा एक स्थिर तरीके से एक्सेस किया जाना चाहिए, यानी,' एमेम्बर ++;'। – jlordo

+0

जब आप संदेह में हैं तो इसका परीक्षण करें! :) +1 – Pragmateek

0

हां, वे चर साझा करेंगे। जेनेरिक के उपयोग के आधार पर स्थैतिक वर्ग चर के नियम नहीं बदलते हैं। एक स्थिर वर्ग चर सभी मामलों द्वारा साझा किया जाता है।

+1

यह मंजूर के लिए नहीं लिया जाना चाहिए। सी ++ 'ए 'और' ए ' में अलग-अलग स्थिर डेटा सदस्यों के साथ अलग-अलग वर्ग होंगे। –

+0

@ निकोलामुसाट्टी: यह 'जावा' टैग के तहत एक प्रश्न है .... – jlordo

+0

दरअसल। फिर भी जावा जेनरिक सी ++ टेम्पलेट्स से प्रेरित थे और मुझे लगता है कि मतभेदों को इंगित करना महत्वपूर्ण है। –

0

वे सभी अपने स्थिर गुण साझा करते हैं क्योंकि रनटाइम A<Integer> और A<String> विशिष्ट कक्षाएं नहीं हैं।

0

आपको सिर्फ यह सोचना है कि जेनरिक संकलन उद्देश्य के लिए हैं। रनटाइम पर, A<Integer> और A<String> के बीच कोई अंतर नहीं है: वे A के सभी उदाहरण हैं। इसलिए आपके द्वारा उपयोग किए जा रहे प्रकार के संबंध में, बिना किसी भी उदाहरण के स्थिर आंकड़े सामान्य हैं।

3

अच्छा प्रश्न लेकिन anwser है: कोई आप एक बहुत ही सरल कारण के लिए नहीं कर सकते हैं: एक बार वहाँ संकलित> एक < पूर्णांक के रूप में ऐसी कोई बात या एक < स्ट्रिंग>, केवल एक वजह के लिए पश्चगामी संगतता कारणों जावा है जेनेरिक प्रकार-मिटा का उपयोग करता है।

अन्य भाषाओं जैसे सी # चीजें काम करेंगे क्योंकि आप उम्मीद करते हैं क्योंकि सी # जेनरिक के साथ शुरू से बनाया गया था।

+0

सी # का उल्लेख करने के लिए धन्यवाद। मेरे विचार का मूल सी # उदाहरण से आया था। – Quirin

+0

मैं एक समान स्थिति में हूं: जावा का उपयोग करते समय अतीत में 10 साल पहले जाना मुश्किल है लेकिन मुझे यकीन है कि यह अंतर को भर देगा। :) – Pragmateek

2

कोई वर्ग शाब्दिक (A<Integer>.class या Class उदाहरण) नहीं है जो पैरामीटरयुक्त प्रकार (जैसे A<Integer>) का प्रतिनिधित्व करता है। कच्चे संस्करण A (यानी A.class) के लिए हमेशा एक ही होगा, और यही वह व्यक्ति है जिसके साथ सभी स्थिर सदस्य हैं।

यही कारण है कि आप A<Integer>.member जैसे कुछ नहीं करेंगे, यह हमेशा कच्चे संस्करण A.member (और यह सभी उदाहरणों द्वारा साझा किया गया एक (और केवल) होना चाहिए)।

आप यहां विषय पर एक लेख पढ़ सकते हैं - Is there one instances of a static field per instantiation of a generic type?

संबंधित मुद्दे