在字符串连接中使用 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 用法:

  1. 语句super()用于调用parent构造函数和 只能从 child 的构造函数中调用。它也必须是 child 构造函数中的第一条语句。
  2. super.instance_variable
  3. 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

  • Field Access Expressions

    • super . Identifier 这种形式访问超级class 成员。

    • TypeName . super . Identifier 这种形式访问封闭 class.

      的 superclass 成员
  • Method Invocation Expressions

    • super . Identifier ( [ArgumentList] ) 这种形式调用了一个 superclass 方法。

    • TypeName . super . Identifier ( [ArgumentList] ) 这种形式要么调用超接口方法,要么在封闭的 class 中调用 superclass 方法,具体取决于 TypeName 是否是class 名称或接口名称。

  • Method Reference Expressions

    • 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 虽然可以参与更大的作品,但它本身可以作为主要表达式,这允许它使用运算符参与更复杂的表达式。