J'ai la classe suivante, qui ne compile pas: Il donne l'erreur d'erreur de compilation Est-ce que quelqu'un sait, pourquoi cette erreur de compilateur se produit? L'effet prévu serait encore plus surprenant que le code suivant compile bien: p> alors pourquoi J'utilise Erreur de syntaxe sur jeton "super", expression invalide code>. P>
"test" + super.tostring () code>, qui compilait bien, mais pourquoi l'exemple ci-dessus ne parvient-il pas à compiler? Les règles de Java normales ne devraient-elles pas s'appliquer ici? P>
Ce code> fonctionne dans la concision de chaîne tandis que
Super code> n'est pas? p>
OpenJDK 11.0.3 2019-04-16 Code> , juste au cas où cela importe (ce que je doute). P> p>
4 Réponses :
simple: "super" ne peut pas être utilisé de cette façon. P>
Ce mot clé peut être utilisé pour appeler un super constructeur ou pour référencer une méthode / champ super. Mais il ne peut pas supporter "tout seul". p>
Comme il n'y a pas d'objet "super". Vous pouvez utiliser "Ceci" pour faire référence à "Cet objet", mais comme il n'y a pas d'objet "autonome". Donc, la langue ne vous permet pas d'utiliser "super" comme vous pouvez utiliser "Ceci". p>
Eh bien, ce n'est pas un objet autonome, mais de ce que j'ai appris, il est simplement équivalent à une distribution de ce type code> au type de classe parent, qui force le compilateur à appeler la méthode de la classe mère .
@Doriangray je vous suggère de revoir ce sujet. Soit votre source est fausse ou vous y êtes mal interprété.
Eh bien, à partir du 15.11.2. Accéder aux membres de Superclass utilisant Super Le formulaire Super.Identifier fait référence au champ Identificateur nommé de l'objet actuel, mais avec l'objet actuel considéré comme une instance de la superclasse de la classe actuelle. Je pensais que "considéré comme" est à peu près la même chose que "cassed dans" .. également, plus en dessous des États-Unis dans l'exemple:: Au cours de la classe T3, l'expression Super.x est traitée comme si elle était suivante: ((T2) Cette x
Le mot clé Selon Java Spec: p>
Les formulaires utilisant le mot-clé super sont valides uniquement dans une instance
méthode, initialisateur d'instance, ou constructeur, ou dans l'initialisateur de
une variable d'instance d'une classe. S'ils apparaissent ailleurs, un
Une erreur de compilation sur la compilation se produit. P>
blockQuote> super code> en Java n'est pas une référence d'objet
Super code> est un mot-clé pour découvrir la classe
Autant que je sache, c'est une référence d'objet à ceci code> étant lancé dans le type de classe parent. Je ne sais pas non plus comment le paragraphe que vous avez cité répondu à ma question, comme j'utilise Super dans une méthode d'instance.
Super n'est pas un objet normal, cela peut être utilisé seul. Super ne peut pas.
EG: P> Super code> USAGES:
super () code> est utilisé pour appeler le constructeur parent et
peut être invoqué uniquement du constructeur de l'enfant. Il doit aussi être
la première déclaration du constructeur de l'enfant. LI>
class Animal {
String name;
Animal() { }
String myName() {
return name;
}
}
class Dog extends Animal {
Dog() {
super();
}
public String toString() {
return "Test " + super.myName() + super.name;
}
}
Je ne parle pas de super () code> dans un appel de constructeur, mais à propos de l'utilisation de
"test" + super code> dans une méthode appel. Je ne peux pas utiliser
ce code> dans mon exemple car cela conduirait à une récursion infinie.
Il n'y a pas d'utilisation pour juste i> super.
@DorianGray Vous avez deux réponses en vous expliquant maintenant que l'utilisation de Super n'est pas possible comme ça. La vraie question est la suivante: quelle est votre méthode de tostring censée faire ?!
Eh bien, il serait censé être équivalent à "test" + super.tostring () code> dans l'exférence ci-dessus.
Le mot clé Les types d'expressions suivants sont les productions de grammaire Java, y compris Accès sur le terrain Expressions p>
Invocation de la méthode Expressions p>
Référence de la méthode Expressions p>
En revanche, primaire: p>
primaireNonewarray p>
ArrayCreationExpression p>
primaireNonewarray: p>
littéral p>
Classliteral P>
typename. CLASSILSTANCECREATIONEXPRESSION P>
FieldAccess p>
ArrayAccess p>
MéthodeInvocation P>
méthodraference p>
blockQuote>
Le mot clé résumer, super code> en soi n'est pas une expression Java valide. Le résumé de la réponse est que
super code> n'est tout simplement pas utilisé de cette façon en Java. P>
Super code>, dont aucune ne présente
super code> par lui-même: p>
super. Identifiant code> Ce formulaire accède aux membres de la superclasse. P>
li>
typename. super . Identifiant CODE> Ce formulaire accède aux éléments de superclasses de la classe entourant. P>
li>
ul>
li>
super. Identifiant ([ArgumentList]) Code> Ce formulaire appelle une méthode de superclasse. P>
li>
typename. super . Identifiant ([ArgumentList]) Code> Ce formulaire appelle une méthode de superinterface ou une méthode de super-class dans une classe de joint, selon que
typename code> est un nom de classe ou un nom d'interface. P >
li>
ul>
li>
Super :: identifiant code> p>
li>
typename. Super :: [Typeearguments] Identifiant Code> P>
li>
ul>
li>
ul>
Ce code> est une expression, car il est autorisé à former un Expression primaire . Le mot-clé
super code> par lui-même n'est pas dans cette liste de productions ni dans les sous-productions. Pensez à un «primaire» comme bloc de base d'une expression. P>
ceci code> p>
ceci code> p>
( code> expression
) code> p>
Ce code> fonctionne dans une expression car c'est un primaire, qui peut participer à des expressions plus compliquées et plus compliquées impliquant des opérateurs tels que
+ p>. p>.
Super code> n'est impliqué que dans des productions plus importantes pour faire référence à des moyens spécifiques d'accéder à la superclasse. Le mot clé
ceci code>, alors qu'il peut être impliqué dans des productions plus importantes, est autorisé par lui-même comme une expression primaire, ce qui lui permet de participer à des expressions plus compliquées à l'aide d'opérateurs. P>