2016-11-25 71 views
8

我讀JLS 8 and in Chapter 6寫入:簡單名稱和限定名

限定名稱NX可以用來指一個包或 引用類型,其中,N是一個簡單的或合格的名稱的成員x是 標識符。如果N命名一個包,則x是該包的成員,即 ,它是一個類或接口類型或一個子包。如果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節)。一個字段訪問表達式,以及一個方法調用 表達式,一個方法引用表達式和一個限定類 實例創建表達式,使用標識符而不是名稱來表示感興趣的成員。因此,參數 args [0] .length()中的長度不是名稱,而是出現在方法調用表達式中的標識符。

,所以我想我明白,並非所有的表情都是合格的名稱和 甚至我的表情c.n

老實說,我無法理解的區別誰能幫助我?

+0

如果您要添加一些鏈接,閱讀您所指的規範部分會更容易。 –

+0

你在這裏想了解什麼?不要誤解我的意思,我不是在回答這個問題,我喜歡閱讀JLS來找到這樣的事情,但我必須說,我也在爲這個區別而努力 - 我認爲這可能有助於理解當前問題的具體背景,而不是規範的一般性。 –

回答

5

在您的爲例:

int j;是一個簡單的表達名字,因爲它是由一個單一的標識符

合格例如,從JLS 6.5.6.2. Qualified Expression Names

如果一個表達式的名字是的形式Q.Id,那麼Q已經被分類爲包名稱,類型名稱或表達式名稱。

c.nc是表達名稱,n是類T的字段(C類中的爲例)。所以c.n是一個合格的表達式名稱。

args.length也是一個合格的表達式名稱。 args是一個數組,所以它不是一個真正的特定類(沒有。但是它仍然是一個名爲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

不是OP詢問'args.length',而不是'args [0] .length()'的情況,但是? –

+0

@AndyTurner在這個問題中,OP引用了JLS中的一句話,說args.length是一個合格的名字。我認爲這很明顯,但我會添加這個答案也:) –