为了账号安全,请及时绑定邮箱和手机立即绑定

不会将toString()方法中的super关键字隐式转换为super.toString()

不会将toString()方法中的super关键字隐式转换为super.toString()

侃侃尔雅 2021-04-10 18:15:16
我有以下两个类,如下所示。为了简单起见,仅显示toString重写的方法。        public class Circle {        @Override            public String toString() {                return "Circle";            }        }        public class Cylinder extends Circle {            @Override            public String toString() {     //     return "Cylinder"+this;  // runs without explicitly calling toString() on this keyword     //     return "Cylinder"+super;  // throws error, asks to delete super token            return "Cylinder["+super.toString(); // runs without error after adding .toString() with super keyword            }}我遇到的问题是我对超级关键字的理解。super关键字的toString()应该像该关键字一样被隐式调用。实际上,大多数教程和书籍都将super关键字称为对超类的对象引用,因此它的行为必须与与toString()中的“ +”串联运算符一起使用时,此关键字。请帮助我理解这一点。
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

this不同,Java中的super关键字不是对象引用。

用作对调用对象的引用。

但是,这里面有可以存储在没有引用ID超级 是用来解决父类,它的方法和数据成员的关键字。

因此,您无法打印super关键字的值。您只能使用super关键字访问父类的方法和成员。


查看完整回答
反对 回复 2021-04-18
?
UYOU

TA贡献1878条经验 获得超4个赞

根据Java语言规范§15.11.2和§15.12.1,

使用以下方式访问超类成员 super

该表单super.Identifier引用Identifier当前对象的命名字段,但是将当前对象视为当前类的超类的实例。

表单T.super.Identifier是指与Identifier相对应的词汇包围实例的名称字段T,但将该实例视为的超类的实例T

...

编译时步骤1:确定要搜索的类或接口(在方法调用表达式中)

如果形式为super.[TypeArguments]Identifier,则要搜索的类是其声明包含方法调用的类的超类。

它仅提及super表达式的两种形式-super.IdentifierT.super.Identifier。您没有使用这两种形式。您使用的super好像是一样this,就好像它是可以自己使用的某种变量一样。这是不正确的,super其行为与完全不同this

如果您比较规格描述的方式this

§15.8.3 this

关键字this只能在以下情况下使用:

  • 在实例方法或默认方法的主体中(第8.4.7节,第9.4.3节)

  • 在类的构造函数的主体中(第8.8.7节)

  • 在类的实例初始化器中(第8.6节)

  • 在类的实例变量的初始化程序中(第8.3.2节)

  • 表示接收器参数(第8.4.1节)

如您所见,这意味着this可以单独使用。super不能。

此外,像的表达式"Cylinder"+super比的可读性差"Cylinder"+suer.toString()。你不觉得吗 顺便说一句,return "Cylinder"+this;可能会导致无限递归。


查看完整回答
反对 回复 2021-04-18
  • 3 回答
  • 0 关注
  • 319 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信