2013-05-12 13 views
23

this table of Java operator precedence and associativityによれば、メンバアクセスはnewオペレータより優先されます。クラスmyClassと非静的メンバ関数myFunction与えしかし括弧なしでJavaの新しいオブジェクトのメソッドを呼び出す:操作違反の順序?

、次のコード行は有効です:new前に評価され

new myClass().myFunction();

.場合、どのようにこの行を実行することができますか?言い換えれば、カッコが不要なのはなぜですか?

(new myClass()).myFunction();

私の推測では、.()株式優先するので、myClass()が最初に評価され、そのため、コンパイラはゼロでさえパラメータを持つmyClassコンストラクタが呼び出されているnewキーワードを評価する前に知っていることです。しかし、これはまだ最初の行がnew (myClass().myFunction());と一致するはずであることを暗示しているようです。ではなく、です。

+3

この表は標準的な参照ではありません。証拠として引用することはできません。 – EJP

+0

@EJPまあ、それは完璧ではないことが分かっていますが、それは十分に信頼できると思われました。他の優先順位表は同じことを示しているか、まったく「除外」されているようです。 –

+0

あなたはそれを両方向にすることはできません。それは完璧で100%信用できるか、それを証拠として引用することはできません。それが規範的でないという事実は、それが100%信頼できるものではないことを意味します* ipso facto。* Java Tutorialの事実を含む他の優先順位テーブルにも同じことが適用されます。唯一の標準的なリファレンスは[Java言語仕様、第18章](http://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html)です。 – EJP

答えて

32

これは、Java言語のgrammarがどのように定義されているかによるものです。演算子の優先順位は、同じ字句シーケンスを2つの異なる方法で解析できる場合にのみ有効ですが、そうではありません。

なぜですか?

割り当てがで定義されているため:メソッド呼び出しが定義されている間

Primary: 
    ... 
    new Creator 

Selector: 
    . Identifier [Arguments] 
    ... 

との両方がここで使用される:

Expression3: 
    ... 
    Primary { Selector } { PostfixOp } 

ので何が起こるかということです

new myClass().myFunction(); 

  Expression 
      | 
      | 
    ---------+-------- 
    |    | 
    |    | 
    Primary  Selector 
    |    | 
    |    | 
---+---   ... 
|  | 
new Creator 

として解析されるのでPrimaryが前に低減されるため選択の余地は優先度に応じてありません。

new OuterClass.InnerClass() 

クラス名などの特殊な状況のためにそれを心が実際にnewオペレータの前に解析され、実際にそのケースを処理するためのルールがあります。あなたがそれらを見たい場合は、文法をチェックしてください。

+0

良い答え。ダイアグラムありがとう! – Andbdrew

+0

偉大な答え。どうもありがとう。 –

1

私はジャックの図から導かれる結論には同意しません。文法が記述されるとき、その非終端記号と構造は、記述されている言語の優先順位と結合性を実装するように設計されています。そのため、古典的なBNF式では、 "term"と "factor"の非終端記号が導入され、演算の加算優先順位の前に通常の乗算​​が適用されます。

文法の "Primary - > new Creator"と "Expression - > Primary Selector"は、 "New Creator"が "Primary Selector"よりも優先度が高いということです。

文法は、Java演算子の優先順位と結合表が正しくないという証拠です。

+0

あなたが反対するジャックの答えに特定の前提があるようです。「演算子の優先順位は、同じ字句シーケンスが2つの異なる方法で解析できるときに起きます。実際に、いくつかの文法は操作の順序に関してあいまいであり、文法仕様自体に加えて優先順位表*を持つことがあります。 –

+0

しかし、これは、Javaの場合ではない*正しいものであるようです。[第15章仕様](https://docs.oracle.com/javase/specs/jls/se8/html/jls- 15.html)は次のように述べています。「演算子間の優先順位は、文法の階層構造によって管理されます。優先順位の最も低い演算子はラムダ式の矢印( - >)で、その後に代入演算子が続きます。あなたの答えは証拠としてこの引用を引用することによって改善されるでしょう。 –

+0

(この見積もりは仕様の新しいリビジョンからのものですが、この質問にはラムダはまだJavaで導入されていないためです) –

関連する問題