jestem na rozwiązywaniu zagadek niektóre Java i natknęliśmy się na ten jeden:JDK 1.7 vs JDK 1.6 klas wewnętrzne różnicy spadków
public class Outer {
class Inner1 extends Outer {}
class Inner2 extends Inner1 {}
}
Podczas kompilowania tego kodu z javac 1.6.0_45
dostaję, zgodnie z oczekiwaniami, ten błąd:
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}
^
Wynika to kompilator generuje domyślnego konstruktora dla Inner2
klasie z podobnym kodzie, co tłumaczy błąd powyżej:
Inner2() {
this.super();
}
I to jest oczywiste, teraz, bo naprawdę nie można tego zrobić w Java 1.6.0_45, JLS 8.8.7.1 (jak się domyślam):
An explicit constructor invocation statement in a constructor body may not refer to any instance variables or instance methods declared in this class or any superclass, or use this or super in any expression; otherwise, a compile-time error occurs.
See (accepted answer w Odd situation for "cannot reference this before supertype constructor has been called")
Ale jeśli spróbuję skompilować go z javac 1.7.0_79
- jest OK!
Tutaj pojawia się pytanie - Co zostało zmienione w Javie 1.7, że ten kod jest teraz poprawny?
Z góry dziękuję!
@EJP sprawdziłeś [zaakceptowaną odpowiedź] (http://stackoverflow.com/a/3383555/365237) tego, ponieważ ten wygląda odpowiednio – eis
@EJP, również, 'this.super() 'jest ** nie ** równoważne' super() '. Jeśli spróbujesz to zrobić w nie-wewnętrznej klasie, która nie jest zagnieżdżona, otrzymasz błąd kompilacji przed [JLS1.6 8.8.7.1]. 'Jeśli S nie jest klasą wewnętrzną lub deklaracja S występuje w kontekście statycznym, to nie istnieje natychmiast załączająca instancja i względem S. Błąd kompilacji występuje, gdy wywołanie konstruktora nadklasy jest kwalifikowanym wywołaniem konstruktora klasy nadrzędnej. "Podobne do [JLS1.7 8.8.7.1]. – ar4ers