2016-11-25 4 views
8

IはJLS 8 and in Chapter 6を読んだが書き込まれる:簡単な名前と修飾名

を修飾名NxがNは単純又は修飾名であり、パッケージまたは 参照タイプのメンバーを指すために使用することができますxは 識別子です。 Nがパッケージに名前をつけた場合、xはそのパッケージのメンバであり、 はクラスまたはインターフェイスタイプまたはサブパッケージです。 Nの名前 が参照タイプまたは参照タイプの変数である場合、xは というタイプのメンバー(クラス、インターフェイス、フィールド、 またはメソッド)の名前を付けます。

ので、私はこれを持っていることを想像できます c.nが修飾名である一方、

class C 
{ 
    public int n; 
} 

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

jは単純な名前です。

しかし、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 が修飾名(§6.5.6.2)であるため

args.lengthの長さの発生は名前とフィールドアクセス式 (15.11)ではありません。フィールドアクセス式とメソッド呼び出し 式、メソッド参照式、および修飾されたクラス インスタンス作成式は、名前ではなく識別子を使用して、 が対象のメンバーを示します。したがって、 のargs [0] .length()の長さの出現は名前ではなく、 に表示される識別子で、メソッド呼び出し式に現れます。

ので、私は私がいないすべての式が修飾名と も私の表現c.n

であることを理解だと思う正直なところ、私は違いを理解することはできません誰も私を助けることができますか?あなたのexempleで

+0

いくつかのリンクを追加する場合は、参照している仕様のセクションを読む方が簡単です。 –

+0

ここであなたが理解しようとしていることは何ですか?私は間違っていない、私は質問をノックしていない、私はこのようなものを見つけるためにJLSを読むのが大好きだが、私は区別するために苦労していると言わなければならない - そして、仕様の一般性ではなく、問題の具体的な状況を把握する必要があります。 –

答えて

5

:それは資格を例えば単一の識別子

で構成されているので

int j;JLS 6.5.6.2. Qualified Expression Namesから、単純な式名である:

式名がである場合Q.Id形式の場合、Qはすでにパッケージ名、型名、または式名として分類されています。

c.n

cnがクラスT(あなたexempleのクラスC)の分野で、式名です。したがって、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} 

Cf. https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12

+0

OPは 'args [0] .length()'の場合ではなく、 'args.length'について質問していませんか? –

+0

@AndyTurner質問では、OPはargs.lengthが修飾名であると言ってJLSからの文を引用しました。私はそれが明らかだったと思うが、私はこれも答えを追加します:) –

関連する問題