繁体   English   中英

在字符串混叠中使用super时编译失败

[英]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用法:

  1. 语句super()用于调用父级构造函数,并且只能从子级的构造函数中调用。 它也必须是子代构造函数中的第一条语句。
  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引用当前对象,并且可以单独调用。

简单:“超级”不能以这种方式使用。

该关键字可用于调用超级构造函数或引用超级方法/字段。 但是它不能“全部依靠”。

由于没有“超级”对象。 您可以使用“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM