प्र) स्थिर सामग्री तक पहुँचने के संबंध में, उपयोगकर्ता परिभाषित पैकेज और जावा सिस्टम पैकेज (जैसे कि java.lang आदि) में क्या अंतर है।

मैं ocjp6 की तैयारी कर रहा हूं। 1.6.26 जावा संस्करण का उपयोग करना

मेरे जावा प्रोग्राम में PackageTest.java . में "पैक" नाम का एक पैकेज है

package pack;
public class PackageTest {
    public static final int i=20;
  }
}

javac -d . PackageTest.java 

पैक फ़ोल्डर में PackageTest.class फ़ाइल बनाई

अब किसी अन्य जावा से पैकेजटेस्ट क्लास की स्थिर सामग्री तक पहुंचना

कार्यक्रम (TestStaticContents.java) नीचे के रूप में

import pack.PackageTest.*; 
// here importing all contents of PackageTest class
class TestStaticContents {
public static void main(String[] args){
System.out.println("normal import, accessing i value with class name: "+PackageTest.i);
    }
}

javac TestStaticContent.java  

संकलन त्रुटि प्रदर्शित करना:

TestStaticContents.java: cannot access PackageTest bad class file: .\PackageTest.java   

अगर मैं अपने जावा प्रोग्राम से मैथ क्लास की स्थिर सामग्री तक पहुंचने का प्रयास करता हूं तो यह कोई संकलन त्रुटि प्रदर्शित नहीं कर रहा है यानी

import java.lang.Math.*; 
// here importing all contents of Math class
class TestMathStaticContents {
public static void main(String[] args){
System.out.println("normal import, accessing pi value with class name : "+ Math.PI);
    }
}

javac TestMathStaticContents.java 

कोई संकलन त्रुटि नहीं, और PI मान अपेक्षानुसार मुद्रित होता है।

उपयोगकर्ता परिभाषित पैकेज की तुलना में यह व्यवहार अलग क्यों है?

1
karusai 11 अप्रैल 2017, 06:12
यह सही है। ओपी, आप PackageTest.java के भीतर सभी गैर-निजी स्थिर क्षेत्रों और विधियों तक पहुंच प्राप्त करने के लिए import static pack.PackageTest.*; को कॉल कर सकते हैं।
 – 
Jacob G.
11 अप्रैल 2017, 06:20
आपके जवाबों के लिए धन्यवाद। लेकिन
 – 
karusai
11 अप्रैल 2017, 06:36
लेकिन नाथन ह्यूजेस, यह व्यवहार क्यों सिस्टम परिभाषित पैकेजों की तुलना में अलग है। और @JacobG। मुझे पता है कि स्थिर आयात का उपयोग करके हम सभी गैर-निजी स्थिर डेटा सदस्यों तक पहुंच प्राप्त कर सकते हैं। जानना चाहते हैं कि सिस्टम परिभाषित संकुल के साथ उपयोगकर्ता परिभाषित संकुल के लिए यह अंतर क्यों है। -करुसाई
 – 
karusai
11 अप्रैल 2017, 06:43
मैं आपका प्रश्न पूरी तरह समझ नहीं पा रहा हूं, लेकिन मुझे कोई अंतर नहीं दिख रहा है।
 – 
Jacob G.
11 अप्रैल 2017, 06:44
नाथन की टिप्पणी की भी अवहेलना करें, आयात पूरी तरह से मान्य है; मेरा मानना ​​​​है कि उसने प्रश्न को गलत समझा, जैसा कि मैंने किया। हालाँकि मैंने किसी भी भ्रम को दूर करने के लिए एक उत्तर प्रदान किया।
 – 
Jacob G.
11 अप्रैल 2017, 06:57

2 जवाब

मुझे विश्वास है कि मैं अब आपकी समस्या को समझता हूं। आपने PackageTest.java और TestStaticComponents.java दोनों को एक ही पैकेज pack में रखा है। समान पैकेज साझा करने वाले दो वर्ग स्पष्ट रूप से एक दूसरे को आयात नहीं कर सकते हैं।

आपने TestStaticComponents.java को पैकेज-निजी श्रेणी पहचानकर्ता प्रदान करके स्वयं इस बात का संकेत दिया है।

यदि दोनों वर्ग अलग-अलग पैकेज में रहते हैं तो आपका आयात विवरण पूरी तरह से काम करता है।

1
Jacob G. 11 अप्रैल 2017, 06:54
मुझे लगता है कि आप जो कह रहे हैं वह बिल्कुल अलग है, क्या आप कृपया मेरे प्रश्न को दोबारा पढ़ सकते हैं,
 – 
karusai
11 अप्रैल 2017, 07:07
मैंने आपका प्रश्न पढ़ लिया है। आपका कोड संकलित नहीं होता है क्योंकि PackageTest.java और TestStaticComponents.java दोनों पैकेज में स्थित हैं, pack। इसलिए, किसी भी वर्ग को दूसरे के भीतर स्पष्ट रूप से आयात करने का प्रयास संकलन नहीं करेगा। क्योंकि दोनों वर्ग एक ही पैकेज साझा करते हैं, स्पष्ट रूप से किसी भी वर्ग को आयात करने की आवश्यकता नहीं है, क्योंकि आपके पास पहले से ही उनके तरीकों तक पहुंच है।
 – 
Jacob G.
11 अप्रैल 2017, 07:10
यदि आप TestStaticComponents.java को संकलित करना चाहते हैं, तो केवल आयात विवरण हटा दें: import pack.PackageTest.*;
 – 
Jacob G.
11 अप्रैल 2017, 07:12
क्षमा करें @ जैकोबजी, आपके विश्लेषण के लिए धन्यवाद लेकिन यह सही नहीं है। कृपया फिर से पढ़ें, TestStaticContents.java एक अलग फ़ाइल है और यह आयात कर रही है (यानी आयात पैक.पैकेजटेस्ट।*;)। PackageTest.java एक अलग फ़ाइल है जो TestStaticContents.java के लिए आवश्यक पैकेज बना रही है।
 – 
karusai
11 अप्रैल 2017, 07:19
"के लिए आवश्यक पैकेज बनाने" से आपका क्या तात्पर्य है? एक वर्ग दूसरे के लिए आवश्यक पैकेज नहीं बना सकता, कम से कम तब तक नहीं जब तक कि जुलाई में JDK 9 का मॉड्यूल सिस्टम जारी नहीं हो जाता। मेरा मानना ​​​​है कि आप जिस समस्या का सामना कर रहे हैं, उसके बारे में आप भ्रमित हैं, लेकिन मेरा समाधान इसे सुधारता है।
 – 
Jacob G.
11 अप्रैल 2017, 07:22

import java.lang.Math.*, स्थिर सदस्यों से नहीं, Math से नेस्टेड प्रकारों को आयात करने का प्रयास करता है। आपको import static का उपयोग करना चाहिए:

import static java.lang.Math.PI; //recommended to avoid wildcards

आयातित स्थिर सदस्यों का उपयोग करते समय, आपको सदस्य का उपयोग करते समय वर्ग को संदर्भित करने की आवश्यकता नहीं है: आप Math.PI के बजाय PI का उपयोग कर सकते हैं।

कोई संकलन त्रुटि नहीं, और PI मान अपेक्षानुसार मुद्रित होता है।

ऐसा इसलिए है क्योंकि java.lang.Math, java.lang पैकेज के सभी प्रकारों की तरह, स्वचालित रूप से आयात किया जाता है: इसे आयात करने की कोई आवश्यकता नहीं है। इस वजह से, Math.PI आपकी अपेक्षा के अनुरूप त्रुटि उत्पन्न नहीं कर रहा है।

यदि आपने Math.PI के बजाय PI का उपयोग किया है, तो आपको एक त्रुटि मिली होगी, यह सूचित करते हुए कि स्थिर सदस्य आयात नहीं किया गया था।

1
Dioxin 11 अप्रैल 2017, 13:32