Priorytet operatorów - new vs .

0

Mając taki o to fragment kodu:

public class Outside { //Klasa zewnętrzna.
	class Inside { //Klasa wewnętrzna.
		public void f(){ } //Metoda klasy wewnętrznej.
	}
	public void g(){ } //Metoda klasy zewnętrznej.
	public static void main(String args[]){
		
		new Outside().g(); //Utwórz obiekt klasy Outside, a następnie wywołaj jego metodę o nazwie g,
                                              // odwołanie do obiektu nie jest nigdzie zapamiętywane.
	
		Outside out = new Outside(); //Jak wyżej. Odwołanie do obiektu jest zapamiętywane w zmiennej out.
		out.g();
	}
}

pytanie brzmi:
Czy new Outside().g(); to to samo co (new Outside()).g(); ?
Priorytet operatorów mówi, że . jest wyżej niż new, więc dlaczego najpierw tworzony jest obiekt, a potem wywoływana jego metoda?

0

To działa tak samo jak pointer, w c/c++.

przed kropką masz adres, a po kropce metode z virtual table.

Czyli najpierw musisz adres rozwinąć, żeby móc z tego dostać się do tablicy.

0
Czarny Ogórek napisał(a):

To działa tak samo jak pointer, w c/c++.

przed kropką masz adres, a po kropce metode z virtual table.

Czyli najpierw musisz adres rozwinąć, żeby móc z tego dostać się do tablicy.

Dzięki za odp :) Choć na razie nie wiele mi to mówi. A jak to widzi kompilator i jak się to ma do priorytetów operatorów?

1

https://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html

Wyrażenie:

new Outside().g()

Podchodzi pod regułę Expression3:

Expression3: 
    PrefixOp Expression3
    ( (Expression | Type) ) Expression3
    Primary { Selector } { PostfixOp }

Gdzie Primary to:

Primary: 
[...]
    new Creator
[...]

Czyli precedencja operatorów nie ma tutaj znaczenia. To wyrażenie może być sparsowane tylko w jeden sposób.

(tutaj jak coś takiego czytać: https://docs.oracle.com/javase/specs/jls/se7/html/jls-2.html#jls-2.3 :p)

1

Może chodzi o to, że kolejność operatorów ma znaczenie wtedy, gdy możliwe są różne interpretacje. Tutaj nie ma 2 interpretacji, priorytet operatorów nie jest brany pod uwagę. SO potwierdza: https://stackoverflow.com/questions/16513210/calling-a-method-on-a-new-object-in-java-without-parentheses-order-of-operation.

Ciekawe, czy jest w ogóle taka sytuacja, kiedy istotny jest ten priorytet new. Nie wyobrażam sobie tego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1