2016-11-25 10 views
8

मैं JLS 8 and in Chapter 6 पढ़ रहा हूँ लिखा है:सरल नाम और योग्य नाम

एक योग्य नाम एन एक्स एक पैकेज या संदर्भ प्रकार, जहां N एक साधारण या योग्य नाम है के एक सदस्य का उल्लेख किया जा सकता है और एक्स पहचानकर्ता है। यदि एन पैकेज को नाम देता है, तो एक्स उस पैकेज का सदस्य है, जो या तो कक्षा या इंटरफ़ेस प्रकार या उप-पैकेज है। यदि एन संदर्भ प्रकार या संदर्भ प्रकार का चर है, तो x उस प्रकार के सदस्य का नाम है, जो या तो कक्षा, एक इंटरफ़ेस, फ़ील्ड, या कोई विधि है।

तो मैं कल्पना कर सकता है कि इस होने:

class C 
{ 
    public int n; 
} 

int j; 
C c = new C(); 
j = 11; 
c.n = 11; 

j जबकि c.n एक योग्य नाम है एक सरल नाम है।

हालांकि 6.2 चीजें जटिल हो जाती हैं। इस कोड को दिया जाता है:

class Test { 
public static void main(String[] args) { 
Class c = System.out.getClass(); 
System.out.println(c.toString().length() + 
args[0].length() + args.length); 
} 
} 

और बाद कहा गया है:

args.length में लंबाई की घटना एक नाम है, क्योंकि args.length एक योग्य नाम है (§6.5.6.2) और फ़ील्ड एक्सेस एक्सप्रेशन (§15.11) नहीं। एक फील्ड एक्सेस एक्सप्रेशन, साथ ही साथ एक विधि आमंत्रण अभिव्यक्ति, एक विधि संदर्भ अभिव्यक्ति, और एक योग्य वर्ग इंस्टेंस सृजन अभिव्यक्ति, नाम के बजाय पहचानकर्ता का उपयोग ब्याज के सदस्य को दर्शाती है। इस प्रकार, तर्कों की लंबाई [0]। लम्बाई() एक नाम नहीं है, बल्कि एक पहचानकर्ता में एक विधि आमंत्रण अभिव्यक्ति में दिखाई देता है।

तो मुझे लगता है मैं समझता हूँ कि नहीं सभी भाव योग्य नाम हैं और भी मेरी अभिव्यक्ति c.n

ईमानदारी से मैं नहीं समझ सकता भेद किसी को भी मेरी मदद कर सकते?

+0

यदि आप कुछ लिंक जोड़ना चाहते हैं तो उस स्पेस के अनुभागों को पढ़ना आसान होगा, जिसका आप उल्लेख कर रहे हैं। –

+0

क्या आप इसे समझने की कोशिश कर रहे हैं? मुझे गलत मत समझो, मैं सवाल खटखटा नहीं रहा हूं, मुझे इस तरह की चीज़ों को ढूंढने के लिए जेएलएस पढ़ना अच्छा लगता है, लेकिन मुझे कहना है, मैं भी भेद के साथ संघर्ष कर रहा हूं - और मुझे लगता है कि यह समझने में मदद कर सकता है spec की सामान्यता के बजाय हाथ में समस्या का विशिष्ट संदर्भ। –

उत्तर

5

अपने उदाहरण में:

int j; एक सरल अभिव्यक्ति नाम है क्योंकि यह एक एकल पहचानकर्ता

योग्य उदाहरण के लिए होते हैं, JLS 6.5.6.2. Qualified Expression Names से है:

एक अभिव्यक्ति के नाम का है प्रपत्र Q.Id, तो क्यू को पहले ही पैकेज नाम, एक प्रकार का नाम, या अभिव्यक्ति नाम के रूप में वर्गीकृत किया गया है।

c.n में, c, एक अभिव्यक्ति नाम है n (अपने उदाहरण में वर्ग सी) वर्ग टी का एक क्षेत्र है। तो c.n एक योग्य अभिव्यक्ति नाम है।

args.length भी एक योग्य अभिव्यक्ति नाम है। args एक सरणी है इसलिए यह वास्तव में एक विशिष्ट वर्ग नहीं है (नहीं।वर्ग फ़ाइल लेकिन run-time type signature is generated though) लेकिन यह अभी भी length नामक फ़ील्ड वाला ऑब्जेक्ट है।

args[0].length() एक योग्य नाम नहीं है क्योंकि length() कक्षा का सदस्य नहीं है। यह एक विधि आमंत्रण अभिव्यक्ति का एक पहचानकर्ता है।

MethodInvocation: 
    MethodName ([ArgumentList]) 
    TypeName . [TypeArguments] Identifier ([ArgumentList]) 
    ExpressionName . [TypeArguments] Identifier ([ArgumentList]) 
    Primary . [TypeArguments] Identifier ([ArgumentList]) 
    super . [TypeArguments] Identifier ([ArgumentList]) 
    TypeName . super . [TypeArguments] Identifier ([ArgumentList]) 

ArgumentList: 
    Expression {, Expression} 

सीएफ। https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12

+0

क्या ओपी 'args [0]। लम्बाई() 'केस के बजाय' args.length' के बारे में नहीं पूछ रहा है? –

+0

@ एंडी टर्नर प्रश्न में, ओपी ने जेएलएस से वाक्य उद्धृत करते हुए कहा कि args.length एक योग्य नाम है। मुझे लगता है कि यह स्पष्ट था लेकिन मैं इसे भी उत्तर जोड़ूंगा :) –

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