2012-04-09 23 views
17

पहली बार जावा में विकासशील, और पहली बार एंड्रॉइड के लिए विकासशील, इसलिए यह काफी नौसिखिया सवाल है।'class 'संपत्ति कैसे काम करती है?

public void onBtnClicked(View v){ 
    /** Handles button navigation */ 

    @SuppressWarnings("rawtypes") 
    Class c; 
    int viewId = v.getId(); 

    switch (viewId) { 

    case R.id.btnNewTourny : 
     c = NewTourny.class; 
     break; 
    case R.id.btnTeamEditor : 
     c = EditTeam.class; 
     break; 
    case R.id.btnCatEditor : 
     c = EditCat.class; 
     break; 
    case R.id.btnLoadTourny : 
     c = EditCat.class; 
     break; 
    case R.id.btnNewCategory : 
     c = NewCat.class; 
     break; 
    default : 
     c = Main.class; 
    } 

    Intent myIntent = new Intent(v.getContext(), c); 
    startActivityForResult(myIntent, 0); 
} 

लघु प्रश्न:

मैं वर्तमान में इस कोड है

.class संपत्ति कर क्या करता है, f.ex. 'सी = न्यू टॉर्नी.class'?

मैं टूरनी के रूप में सी क्यों नहीं डाल सकता (जो इन सभी वर्गों का अभिभावक है)?

लांग प्रश्न:

यह वर्तमान में मेरे पूरे एप्लिकेशन में सभी बटन नेविगेशन संभालती है, और ठीक काम करता है। हालांकि, जैसा कि आप देख सकते हैं, मैंने 'कच्ची टाइप' चेतावनी दबा दी है, जो तब आता है जब मैं कक्षा के रूप में सी डालता हूं। अब, मैं वास्तव में चेतावनियों के बिना एक कोड चाहता हूं, इसलिए मैंने सोचा 'ठीक है, ये सभी कक्षाएं' टूरनी 'का बच्चा हैं, इसलिए मैंने सोचा कि यह काम करेगा, सी को टूरनी के रूप में कास्टिंग करेगा - लेकिन यह काम नहीं करता है। तब मुझे एहसास हुआ कि मुझे वास्तव में पता नहीं था कि "NewTourny.class" कोड वास्तव में क्या करता है, और यह संकेत हो सकता है कि मैं टूर्नी के रूप में सी क्यों नहीं डाल सका। तो, क्लास क्या करता है?

उत्तर

9

यह वास्तव में बहुत कुछ नहीं करता है। NewTourney.class "ऑब्जेक्ट जो NewTourney की कक्षा है" लिखने के लिए एक भाषा विशिष्ट तरीका है। यह शॉर्टेंड NewTourney की से पहलेNewTourney के उदाहरणों के साथ पहले से मौजूद से निपटने के विपरीत है।

अपने विशिष्ट मामले में, मुझे लगता है कि करने के लिए Activity अंत में कार्रवाई को संभालने के लिए वर्ग का एक उदाहरण बनाता है कि खतरा होता है, या कम से कम कार्रवाई के संदर्भ संवेदनशील डेटा रखने के लिए।

+0

कि मैं क्लास के रूप में कास्टिंग ग टाल नहीं सकते, और इस तरह की चेतावनी से बचने के क्या इसका मतलब है, ? – LongInt

+0

कक्षा सी; इसे दूर कर देगा? या कक्षा सी; यदि यह संभव है कि यह एक गतिविधि भी नहीं है! – Blundell

+0

कक्षा इस त्रुटि को फेंकता है: _Type मेल नहीं: वर्ग से वर्ग _ में परिवर्तित नहीं किया जा सकता है, लेकिन कक्षा काम करता है। – LongInt

2

कक्षा कक्षाओं का प्रतिनिधित्व करने वाली एक कक्षा है। :)

यह "ऑब्जेक्ट" नहीं है। यह एक सुपरक्लास या यहां तक ​​कि आपके "न्यू टॉर्नी" पदानुक्रम में भी नहीं है। यही कारण है कि आप न्यूटर्नी से कक्षा में नहीं जा सकते हैं।

.class संपत्ति कक्षा का एक उदाहरण है जो प्रकार की जानकारी का प्रतिनिधित्व करता है।

आप इसे किसी ऐसे चीज को तत्काल करने के लिए प्रतिबिंबित शैली कॉल करने के लिए उपयोग कर सकते हैं जिसे आप संकलित समय के प्रकार नहीं जानते हैं।

+6

बढ़ाता है दरअसल, 'कक्षा' एक 'ऑब्जेक्ट' है जो _class_ का प्रतिनिधित्व करता है। कक्षाएं ऑब्जेक्ट्स हैं, जो एक जेवीएम के भीतर 'कक्षा' में हेरफेर करने के लिए मूर्खतापूर्ण आवश्यकताओं में से एक है, जिसमें केवल दो प्रकार के डेटा, प्राइमेटिव और 'ऑब्जेक्ट' के वंशज हैं। –

1

चेतावनी से छुटकारा पाने के लिए, आप Class<? extends Tourny> के साथ बदल सकते हैं। इसका मतलब है कि सी एक वस्तु नहीं है, जो सभी संभावित वर्गों में से एक का प्रतिनिधित्व करता है, लेकिन अधिक विशेष रूप से Tourny द्वारा प्राप्त कक्षा का प्रतिनिधित्व करता है।

+0

चूंकि सी कई अलग-अलग प्रकार के वर्गों को इंगित कर सकता है, इसे कक्षा घोषित किया जाना चाहिए। –

+0

इसे कक्षा सी में बदलते समय, मुझे यह त्रुटि मेरे स्विच स्टेटमेंट की प्रत्येक पंक्ति में मिलती है: _Type मेलसमूह: कक्षा से कक्षा _ – LongInt

+0

@ माइकल क्रूसेल में परिवर्तित नहीं किया जा सकता: यह चेतावनी को हटाने का काम था! धन्यवाद। – LongInt

1

.class विधि एक सभी objets है जो आपको उस ऑब्जेक्ट की मूल प्रकृति को संदर्भित करने की अनुमति देता है इससे पहले कि आपको इसे प्रारंभ करने का मौका भी मिले। यह अभिभावक नहीं है, यह स्वयं का मूल अपरिवर्तनीय टेम्पलेट है। इसे ".class" कहा जाता है क्योंकि यह कक्षा का प्रत्यक्ष प्रतिनिधित्व है कि केवल कक्षा परिभाषा ही प्रभावित हो सकती है। यह आपको उस कक्षा के सभी सदस्यों को मूल रूप से सामान्य में जानकारी प्राप्त करने के लिए एक नई वस्तु बनाने से बचाता है।

2

कक्षा के उदाहरण जहां कक्षा चल रहे जावा एप्लिकेशन में कक्षाओं और इंटरफेस का प्रतिनिधित्व करती है। यह जावा प्रतिबिंब एपीआई का हिस्सा है। ओरेकल tutorial से:

If the type is available but there is no instance then it is possible to obtain a Class by appending ".class" to the name of the type. This is also the easiest way to obtain the Class for a primitive type.

यहाँ कुछ संदर्भ हैं:

  1. https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
  2. https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html
संबंधित मुद्दे