Ich bin einige Java-Rätsel auf die Lösung und stolperte über dieses:JDK 1.7 vs JDK 1.6 inneren Klassen Vererbung Unterschied
public class Outer {
class Inner1 extends Outer {}
class Inner2 extends Inner1 {}
}
Während diesen Code mit javac 1.6.0_45
Kompilieren erhalte ich, wie erwartet, dieser Fehler:
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}
^
dies wegen der Compiler erzeugt Default Konstruktor für Klasse Inner2
mit ähnlichem Code, der Fehler, der oben erklärt:
Inner2() {
this.super();
}
Und es ist jetzt offensichtlich, weil Sie wirklich diese in Java nicht kann 1.6.0_45, JLS 8.8.7.1 (wie ich kann mir denken):
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 in Odd situation for "cannot reference this before supertype constructor has been called")
Aber wenn ich versuche, es mit javac 1.7.0_79
zu kompilieren - es ist OK!
Und hier geht die Frage - Was wurde in Java 1.7 geändert, dass dieser Code jetzt korrekt ist?
Vielen Dank im Voraus!
@EJP hast du die [akzeptierte Antwort] (http://stackoverflow.com/a/3383555/365237) von diesem überprüft, da diese Seite relevant aussieht – eis
@EJP, auch this.super() 'ist ** nicht ** äquivalent zu' super() '. Wenn Sie dies in einer nicht-inneren nicht verschachtelten Klasse versuchen, erhalten Sie vor [JLS1.6 8.8.7.1] einen Kompilierungsfehler. Wenn S keine innere Klasse ist oder wenn die Deklaration von S in einem statischen Kontext auftritt, existiert keine unmittelbar einschließende Instanz von i in Bezug auf S. Ein Kompilierungsfehler tritt auf, wenn der Aufruf des Superklassenkonstruktors ein Aufruf eines qualifizierten Superklassenkonstruktors ist. "Ähnlich wie [JLS1.7 8.8.7.1]. – ar4ers