Priorytet operatorów - new vs .

Priorytet operatorów - new vs .
BitemNet
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Wrocław
  • Postów:6
0

Mając taki o to fragment kodu:

Kopiuj
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?

edytowany 1x, ostatnio: BitemNet
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.

BitemNet
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Wrocław
  • Postów:6
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?

Jaca777
  • Rejestracja:około 9 lat
  • Ostatnio:11 miesięcy
1

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

Wyrażenie:

Kopiuj
new Outside().g()

Podchodzi pod regułę Expression3:

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

Gdzie Primary to:

Kopiuj
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)

edytowany 1x, ostatnio: Jaca777
jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
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.


Przeważnie ignoruję niezarejestrowanych użytkowników.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.