14

我是 Java 新手,正在学习基础知识。我正在研究该toString方法以及如何在我自己的课程中覆盖它。我只是想知道为什么必须toString这样做public?是因为它是在Object类中定义的吗?

4

7 回答 7

28

来自官方 Oracle文档

修饰符

覆盖方法的访问说明符可以允许比覆盖方法更多但不能更少的访问。例如,超类中的受保护实例方法可以在子类中公开,但不能私有。

这是因为继承在两个类之间创建了IS-A关系,对此Liskov 替换原则必须有效。如果没有先前的约束,那将是不可能执行的。

于 2013-03-17T23:23:43.793 回答
22

想一想:您将 Gizmo 子类化为 MyGizmo。这意味着任何可以使用 Gizmo 的地方,您都可以在该地方使用 MyGizmo。如果某些程序这样做gizmoObject.toString(),那么即使 gizmoObject 不是 Gizmo 而是 MyGizmo,它也应该可以工作。

特别toString是用于打印和转储对象,并且需要在所有对象上都可以访问。

于 2013-03-17T23:27:10.303 回答
14

当您覆盖任何方法时,覆盖的可见性必须至少与基方法一样可见。

于 2013-03-17T23:21:39.383 回答
2

覆盖任何方法时,覆盖的可见性必须等于大于基方法的可见性

于 2013-03-17T23:23:25.197 回答
1

重写方法时,应将重写方法的可见性声明为基类或更广泛的方法。

这是关于我自己编写的最重要规则的注释,作为对我的参考:

/* 访问修饰符 */

1- 孩子中的访问修饰符应该相同或更大(顺序:公共 - 保护 - 默认(包私有) - 私有)。父级中的访问修饰符不应是私有的。如果子级无法访问父级的方法,则在没有 @Override 注释的情况下覆盖该方法会将其视为新方法。

/* 返回类型 */

2- child 中的返回类型应该是相同的类或子类。

/* 异常 */

3- 如果父方法抛出检查异常,那么子方法可以: a- 抛出相同的异常或子类。b- 不抛出任何异常。c- 抛出运行时异常。

4- 如果父方法抛出未经检查的异常,那么子方法可以: a- 不抛出任何异常。b- 抛出运行时异常。

5- 如果parnet 的方法没有抛出异常,那么child 的方法可以: a- 不抛出任何异常。b- 抛出运行时异常。

于 2013-03-17T23:21:46.447 回答
0

因为您要覆盖一个方法,所以您必须将其定义为原型方法或更多。

于 2013-03-17T23:23:46.820 回答
0

当您覆盖子类方法时,可见性必须比父类更宽。

从宽到严的顺序:

公共 默认 保护 私有

于 2013-03-18T08:46:16.297 回答