In base a this table of Java operator precedence and associativity, l'accesso membro ha precedenza più elevata rispetto all'operatore new
.Chiamare un metodo su un nuovo oggetto in Java senza parentesi: violazione dell'ordine delle operazioni?
Tuttavia, data una classe myClass
e una funzione di membro non statica myFunction
, la seguente riga di codice è valido:
new myClass().myFunction();
Se .
viene valutata prima new
, come può essere eseguito questa linea? In altre parole, perché non sono necessarie le parentesi?
(new myClass()).myFunction();
La mia ipotesi è che, poiché ()
condivide la precedenza con .
, il myClass()
viene valutata prima, e così il compilatore sa ancora prima di valutare la parola chiave new
che il costruttore myClass
con i parametri a zero viene chiamato. Tuttavia, questo sembra ancora implicare che la prima riga dovrebbe essere identica a new (myClass().myFunction());
, che è non il caso.
Questa tabella non è un riferimento normativo. Non puoi citarlo come prova. – EJP
@EJP Bene, mi rendo conto che non è perfetto, ma sembrava sufficientemente affidabile. Altre tabelle di precedenza sembrano indicare la stessa cosa o tralasciare del tutto. –
Non puoi averlo in entrambi i modi. O è perfetto e affidabile al 100% o non lo puoi citare come prova. Il fatto che non sia normativo significa che non è affidabile al 100% * ipso facto. Lo stesso vale per "altre tabelle di precedenza", incluso di fatto quello nel tutorial di Java. L'unico riferimento normativo è [Java Language Specification, Chapter 18] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html). – EJP