2012-01-25 19 views
5

मैं जावा में एक नौसिखिया हूं। पहली बात जो मैंने सीखा वह निष्पादन योग्य वर्ग का मुख्य() विधि सार्वजनिक होना चाहिए और यह कारण तब से दिया गया था जब से इस विधि को JVM द्वारा बुलाया जाएगा, यह कक्षा के बाहर दिखाई देना चाहिए और इसलिए सार्वजनिक होना चाहिए। अब क्रमबद्धता का अध्ययन करते समय मुझे लगता है कि writeObject() और readObject()Serializable कक्षा के निजी तरीकों को जेवीएम द्वारा कॉल किया जा सकता है जबकि ऑब्जेक्ट को क्रमबद्ध और डी-सीरियलाइज करना! अगर वे निजी तरीके हैं तो JVM उन्हें कैसे कॉल कर सकता है? यदि ऐसा हो तो यह मुख्य() विधि क्यों नहीं कॉल कर सकता है?जेवीएम और निजी विधियां

कुछ जावा दस्तावेज के माध्यम से फ़्लिप करने के बाद, मैंने इस पंक्ति को पढ़ा "JVM किसी ऑब्जेक्ट के निजी तरीकों तक पहुंच सकता है"। चूंकि हम ऑब्जेक्टइनपुटस्ट्रीम के उदाहरण का उपयोग करके readObject() को कॉल करते हैं, इसलिए यह JVM तक पहुंच योग्य है, जबकि मुख्य() विधि स्थिर या क्लास विधि है और कक्षा के किसी भी ऑब्जेक्ट को तत्काल किए बिना बुलाया जाना चाहिए ताकि JVM तक पहुंच योग्य हो सके! क्या इसका कोई मतलब है ? मुझे नहीं पता ।

+0

यह सार्वजनिक किया जाना चाहिए, लेकिन वे आप गलत कारण बताया। सही कारण यह है क्योंकि जावा भाषा संदर्भ में ऐसा कहा जाता है। – Ingo

उत्तर

2

खैर सामान्य रूप में मैं @Christian से सहमत हैं, लेकिन मैं 2 अधिक नोट:

  1. मुख्य() फ़ंक्शन भी निजी बनाया जा सकता है।

  2. यदि आपको वास्तव में आवश्यकता है तो आप निजी विधि/फ़ंक्शन भी कॉल कर सकते हैं।

1 जेवीएम मुख्य() वैसे भी कॉल कर सकता है। इसे सार्वजनिक बनाना आपके आवेदन के दूसरे कोड को मुख्य() विधि को कॉल करने में सक्षम बनाता है। आम तौर पर, हालांकि, कोई भी ऐसा नहीं करता है। मुख्य कारण, क्यों मुख्य() सार्वजनिक है, ऐतिहासिक है, AFAIC। अन्य कार्यक्रम भाषाओं में मुख्य() फ़ंक्शन भी होता है और वहां यह सार्वजनिक होता है।

2 यदि आपको वास्तव में आवश्यकता है, तो आप निजी विधि को कॉल करने या निजी क्षेत्र तक पहुंचने के लिए कोर प्रतिबिंब API का उपयोग कर सकते हैं। यह इस तरह दिखता है:

 import java.lang.reflect.Field; 
     class SimpleKeyPair { 
     private String privateKey = "Cafe Babe"; // private field 
     } 
     public class PrivateMemberAccessTest { 
     public static void main(String[] args) throws Exception { 
      SimpleKeyPair keyPair = new SimpleKeyPair(); 
      Class c = keyPair.getClass(); 
      // get the reflected object 
      Field field = c.getDeclaredField("privateKey"); 
      // set accessible true 
      field.setAccessible(true); 
      // prints "Cafe Babe" 
      System.out.println("Value of privateKey: " + field.get(keyPair)); 
      // modify the member varaible 
      field.set(keyPair, "Java Duke"); 
      // prints "Java Duke" 
      System.out.println("Value of privateKey: " + field.get(keyPair)); 
     } 
     } 

http://www.jguru.com/faq/view.jsp?EID=321191

भी देखें इस महान जवाब https://stackoverflow.com/a/2489644/1137529

4

यह सब सम्मेलन के बारे में है। JVM हर विधि को हर जगह कॉल कर सकता है - यह JVM, बॉस है। यदि JVM इसे कॉल नहीं कर सकता है, तो कोई भी नहीं कर सकता है। कल्पना करें कि जेवीएम वह जगह है जहां आपका प्रोग्राम निष्पादित हो जाता है, यह आपके और आपके बाइटकोड के बीच किसी प्रकार का प्रॉक्सी है।

writeObject आपकी कक्षा के बाहर उपयोग नहीं हो सकता है। यह केवल आपके लिए एक आंतरिक विधि है। इस प्रकार जेवीएम के निर्माता इसे निजी छोड़ने पर सहमत हुए। यदि यह निजी नहीं है, तो आपके प्रोग्राम में अन्य कक्षाएं इसे कॉल करने में सक्षम हैं।

मुख्य() विधि एक विधि है जिसे अन्य जावा प्रक्रियाओं द्वारा बुलाया जा सकता है। यदि यह निजी है, तो अन्य प्रोग्राम आपके प्रोग्राम को शुरू करने में असमर्थ हैं। JVM के साथ इसका बहुत कुछ नहीं है, सिवाय इसके कि आप कह सकते हैं कि सामान्य रूप से JVM आपको (!) को केवल आपके कोड के सार्वजनिक (पैकेज, संरक्षित) विधियों को कॉल करने की अनुमति देता है।

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