Je suis sur la résolution des énigmes Java et sommes tombés sur celui-ci:1.7 vs JDK 1.6 JDK classes internes différence d'héritage
public class Outer {
class Inner1 extends Outer {}
class Inner2 extends Inner1 {}
}
Lors de la compilation avec ce code javac 1.6.0_45
je reçois, comme prévu, cette erreur:
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}
^
Ceci est dû compilateur génère constructeur par défaut pour Inner2
classe avec un code similaire, ce qui explique l'erreur ci-dessus:
Inner2() {
this.super();
}
Et il est maintenant évident, parce que vous ne pouvez vraiment pas faire en Java 1.6.0_45, JLS 8.8.7.1 (comme je peux deviner):
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.
Voir (accepted answer en Odd situation for "cannot reference this before supertype constructor has been called")
Mais si j'essaie de le compiler avec javac 1.7.0_79
- c'est OK!
Et voici la question - Qu'est-ce qui a été changé dans Java 1.7, que ce code est maintenant correct?
Merci d'avance!
@EJP avez-vous vérifié la [réponse acceptée] (http://stackoverflow.com/a/3383555/365237) de celle-ci, car celle-ci semble pertinente – eis
@EJP, aussi, 'this.super() 'n'est ** pas ** équivalent à' super() '. Si vous essayez de le faire dans une classe non-imbriquée non interne, vous obtiendrez une erreur de compilation, avant [JLS1.6 8.8.7.1]. 'Si S n'est pas une classe interne, ou si la déclaration de S se produit dans un contexte statique, il n'existe pas d'instance immédiatement adjacente de S par rapport à S. Une erreur compiletime se produit si l'invocation du constructeur de la superclasse est un appel de constructeur qualifié de superclasse. Similaire à [JLS1.7 8.8.7.1]. – ar4ers