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

我有以下两个类,如下所示。为了简单起见,仅显示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()中的“ +”串联运算符一起使用时,此关键字。请帮助我理解这一点。


侃侃尔雅
浏览 320回答 3
3回答

互换的青春

与this不同,Java中的super关键字不是对象引用。这用作对调用对象的引用。但是,这里面有可以存储在没有引用ID超级 超是用来解决父类,它的方法和数据成员的关键字。因此,您无法打印super关键字的值。您只能使用super关键字访问父类的方法和成员。

UYOU

根据Java语言规范§15.11.2和§15.12.1,使用以下方式访问超类成员 super该表单super.Identifier引用Identifier当前对象的命名字段,但是将当前对象视为当前类的超类的实例。表单T.super.Identifier是指与Identifier相对应的词汇包围实例的名称字段T,但将该实例视为的超类的实例T。...编译时步骤1:确定要搜索的类或接口(在方法调用表达式中)如果形式为super.[TypeArguments]Identifier,则要搜索的类是其声明包含方法调用的类的超类。它仅提及super表达式的两种形式-super.Identifier或T.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;可能会导致无限递归。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java