在字符串连接中使用 super 时编译失败
Compilation fails when using super in string concatination
我有以下 class,它无法编译:
public class C {
public String toString() {
return "Test " + super;
}
}
它给出了编译错误Syntax error on token "super", invalid Expression
。
有谁知道,为什么会出现这个编译器错误?预期的效果是 "Test " + super.toString()
,可以正常编译,但为什么上面的示例无法编译?正常的 Java 字符串连接规则不应该在这里应用吗?
更令人惊讶的是,以下代码可以正常编译:
public String toString2() {
return "Test " + this;
}
那么,为什么 this
在字符串连接中有效而 super
不有效?
我正在使用 openjdk 11.0.3 2019-04-16
,以防万一(我对此表示怀疑)。
简单:"super"不能那样用
该关键字可用于调用超级构造函数或引用超级 method/field。但是架不住"all by its own"。
因为没有"super"对象。您可以使用 "this" 来引用 "this" 对象,但是因为没有 "standalone" 超级对象。所以语言不允许你像使用 "this" 那样使用 "super"。
Java 中的 super
关键字不是 对象引用 ,因此您的代码中出现了一些错误!
这样做不是一个好习惯,因为 super
是发现 父 class 的关键字。所以您不能使用该关键字进行打印!
根据 Java 规范:
The forms using the keyword super are valid only in an instance
method, instance initializer, or constructor, or in the initializer of
an instance variable of a class. If they appear anywhere else, a
compile-time error occurs.
super
用法:
- 语句
super()
用于调用parent构造函数和
只能从 child 的构造函数中调用。它也必须是
child 构造函数中的第一条语句。
- super.instance_variable
- super.instance_method
例如:
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
指的是当前的object,可以自己调用。
关键字 super
本身不是有效的 Java 表达式。答案的总结是 super
在 Java.
中根本没有那样使用
以下类型的表达式是 Java 语法产生式,包括 super
、none,其中单独存在 super
:
-
super . Identifier
这种形式访问超级class 成员。
TypeName . super . Identifier
这种形式访问封闭 class.
的 superclass 成员
-
super . Identifier ( [ArgumentList] )
这种形式调用了一个 superclass 方法。
TypeName . super . Identifier ( [ArgumentList] )
这种形式要么调用超接口方法,要么在封闭的 class 中调用 superclass 方法,具体取决于 TypeName
是否是class 名称或接口名称。
-
super :: Identifier
TypeName . super :: [TypeArguments] Identifier
相比之下,this
本身就是一个表达式,因为它允许自己组成一个primary expression。关键字 super
本身不在此作品列表或子作品中。将“主要”视为表达式的基本构建块。
Primary:
PrimaryNoNewArray
ArrayCreationExpression
PrimaryNoNewArray:
Literal
ClassLiteral
this
TypeName . this
(
Expression )
ClassInstanceCreationExpression
FieldAccess
ArrayAccess
MethodInvocation
MethodReference
关键字 this
在表达式中起作用,因为它是一个主要的,它可以参与更大、更复杂的涉及运算符的表达式,例如 +
.
总而言之,super
只是在较大的作品中涉及到访问superclass的具体方式。关键字 this
虽然可以参与更大的作品,但它本身可以作为主要表达式,这允许它使用运算符参与更复杂的表达式。
我有以下 class,它无法编译:
public class C {
public String toString() {
return "Test " + super;
}
}
它给出了编译错误Syntax error on token "super", invalid Expression
。
有谁知道,为什么会出现这个编译器错误?预期的效果是 "Test " + super.toString()
,可以正常编译,但为什么上面的示例无法编译?正常的 Java 字符串连接规则不应该在这里应用吗?
更令人惊讶的是,以下代码可以正常编译:
public String toString2() {
return "Test " + this;
}
那么,为什么 this
在字符串连接中有效而 super
不有效?
我正在使用 openjdk 11.0.3 2019-04-16
,以防万一(我对此表示怀疑)。
简单:"super"不能那样用
该关键字可用于调用超级构造函数或引用超级 method/field。但是架不住"all by its own"。
因为没有"super"对象。您可以使用 "this" 来引用 "this" 对象,但是因为没有 "standalone" 超级对象。所以语言不允许你像使用 "this" 那样使用 "super"。
Java 中的 super
关键字不是 对象引用 ,因此您的代码中出现了一些错误!
这样做不是一个好习惯,因为 super
是发现 父 class 的关键字。所以您不能使用该关键字进行打印!
根据 Java 规范:
The forms using the keyword super are valid only in an instance method, instance initializer, or constructor, or in the initializer of an instance variable of a class. If they appear anywhere else, a compile-time error occurs.
super
用法:
- 语句
super()
用于调用parent构造函数和 只能从 child 的构造函数中调用。它也必须是 child 构造函数中的第一条语句。 - super.instance_variable
- super.instance_method
例如:
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
指的是当前的object,可以自己调用。
关键字 super
本身不是有效的 Java 表达式。答案的总结是 super
在 Java.
以下类型的表达式是 Java 语法产生式,包括 super
、none,其中单独存在 super
:
-
super . Identifier
这种形式访问超级class 成员。
的 superclass 成员TypeName . super . Identifier
这种形式访问封闭 class.
-
super . Identifier ( [ArgumentList] )
这种形式调用了一个 superclass 方法。TypeName . super . Identifier ( [ArgumentList] )
这种形式要么调用超接口方法,要么在封闭的 class 中调用 superclass 方法,具体取决于TypeName
是否是class 名称或接口名称。
-
super :: Identifier
TypeName . super :: [TypeArguments] Identifier
相比之下,this
本身就是一个表达式,因为它允许自己组成一个primary expression。关键字 super
本身不在此作品列表或子作品中。将“主要”视为表达式的基本构建块。
Primary:
PrimaryNoNewArray
ArrayCreationExpression
PrimaryNoNewArray:
Literal
ClassLiteral
this
TypeName .
this
(
Expression)
ClassInstanceCreationExpression
FieldAccess
ArrayAccess
MethodInvocation
MethodReference
关键字 this
在表达式中起作用,因为它是一个主要的,它可以参与更大、更复杂的涉及运算符的表达式,例如 +
.
总而言之,super
只是在较大的作品中涉及到访问superclass的具体方式。关键字 this
虽然可以参与更大的作品,但它本身可以作为主要表达式,这允许它使用运算符参与更复杂的表达式。