[英]Compilation fails when using super in string concatination
我有以下无法编译的类:
public class C {
public String toString() {
return "Test " + super;
}
}
它给出Syntax error on token "super", invalid Expression
的编译错误Syntax error on token "super", invalid Expression
。
谁知道,为什么会发生此编译器错误? 预期的效果是"Test " + super.toString()
,可以正常编译,但是为什么上面的示例无法编译? 字符串隐含的普通Java规则不应该在这里适用吗?
更令人惊讶的是,以下代码可以很好地进行编译:
public String toString2() {
return "Test " + this;
}
那么,为什么this
同时串concatination工作super
不?
我正在使用openjdk 11.0.3 2019-04-16
,以防万一(我怀疑)。
Java中的super
关键字不是对象引用 ,因此您在代码中会收到一些错误! 这样做不是一个好习惯,因为super
是发现父类的关键字。 因此,您无法使用该关键字进行打印!
根据Java规范:
使用关键字super的表单仅在实例方法,实例初始化器或构造函数中或在类的实例变量的初始化器中有效。 如果它们出现在其他任何地方,则会发生编译时错误。
super
用法:
super()
用于调用父级构造函数,并且只能从子级的构造函数中调用。 它也必须是子代构造函数中的第一条语句。 例如:
class Animal {
String name;
Animal() { }
String myName() {
return name;
}
}
class Dog extends Animal {
Dog() {
super();
}
public String toString() {
return "Test " + super.myName() + super.name;
}
}
目前只是没有单独使用super
。 this
引用当前对象,并且可以单独调用。
简单:“超级”不能以这种方式使用。
该关键字可用于调用超级构造函数或引用超级方法/字段。 但是它不能“全部依靠”。
由于没有“超级”对象。 您可以使用“ this”来引用“ this”对象,但是因为没有“ standalone”超级对象。 因此,该语言不允许您使用“ this”的方式来使用“ super”。
关键字super
本身不是有效的Java表达式。 答案的总结是,在Java中根本没有使用super
。
下列类型的表达式是Java语法产生式,包括super
,它们本身都不表示super
:
super . Identifier
super . Identifier
此表单访问超类成员。
TypeName . super . Identifier
TypeName . super . Identifier
此表单访问封闭类的超类成员。
super . Identifier ( [ArgumentList] )
super . Identifier ( [ArgumentList] )
这种形式调用超类方法。
TypeName . super . Identifier ( [ArgumentList] )
TypeName . super . Identifier ( [ArgumentList] )
此形式取决于TypeName
是类名还是接口名,在封闭的类中调用超接口方法或超类方法。
super :: Identifier
TypeName . super :: [TypeArguments] Identifier
相反, this
本身就是一个表达式,因为它本身被允许形成一个主表达式 。 关键字super
本身不在此产品列表或子产品列表中。 将“主要”视为表达式的基本构建块。
主:
PrimaryNoNewArray
ArrayCreationExpression
PrimaryNoNewArray:
文字
类文学
this
TypeName。
this
(
表情)
ClassInstanceCreationExpression
现场访问
数组访问
方法调用
方法参考
关键字this
作品在表达,因为它是一个小学,可参与如涉及经营者更大,更复杂的表达式+
。
总而言之, super
只涉及较大的产品,以指代访问超类的特定方式。 关键字this
(虽然它可以用于较大的产品),但它本身是主要表达式,因此可以使用运算符来参与更复杂的表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.