parsing - Calling a method on a new object in Java without parentheses: order of operations violation? -
according this table of java operator precedence , associativity, member access has higher precedence new
operator.
however, given class myclass
, non-static member function myfunction
, following line of code valid:
new myclass().myfunction();
if .
evaluated before new
, how can line executed? in other words, why aren't parentheses required?
(new myclass()).myfunction();
my guess since ()
shares precedence .
, myclass()
evaluated first, , compiler knows before evaluating new
keyword myclass
constructor 0 parameters being called. however, still seems imply first line should identical new (myclass().myfunction());
, not case.
this because of how grammar of java language defined. precedence of operators comes play when same lexical sequence parsed in 2 different ways not case.
why?
because allocation defined in:
primary: ... new creator
while method call defined in:
selector: . identifier [arguments] ...
and both used here:
expression3: ... primary { selector } { postfixop }
so happens that
new myclass().myfunction();
is parsed as
expression | | ---------+-------- | | | | primary selector | | | | ---+--- ... | | new creator
so there no choice according priority because primary
reduced before. mind special situation like
new outerclass.innerclass()
the class name parsed before new
operator , there rules handle case indeed. check grammar if see them.
Comments
Post a Comment