我是 Java 新手,正在学习基础知识。我正在研究该toString
方法以及如何在我自己的课程中覆盖它。我只是想知道为什么必须toString
这样做public
?是因为它是在Object
类中定义的吗?
7 回答
来自官方 Oracle文档:
修饰符
覆盖方法的访问说明符可以允许比覆盖方法更多但不能更少的访问。例如,超类中的受保护实例方法可以在子类中公开,但不能私有。
这是因为继承在两个类之间创建了IS-A关系,对此Liskov 替换原则必须有效。如果没有先前的约束,那将是不可能执行的。
想一想:您将 Gizmo 子类化为 MyGizmo。这意味着任何可以使用 Gizmo 的地方,您都可以在该地方使用 MyGizmo。如果某些程序这样做gizmoObject.toString()
,那么即使 gizmoObject 不是 Gizmo 而是 MyGizmo,它也应该可以工作。
特别toString
是用于打印和转储对象,并且需要在所有对象上都可以访问。
当您覆盖任何方法时,覆盖的可见性必须至少与基方法一样可见。
覆盖任何方法时,覆盖的可见性必须等于或大于基方法的可见性
重写方法时,应将重写方法的可见性声明为基类或更广泛的方法。
这是关于我自己编写的最重要规则的注释,作为对我的参考:
/* 访问修饰符 */
1- 孩子中的访问修饰符应该相同或更大(顺序:公共 - 保护 - 默认(包私有) - 私有)。父级中的访问修饰符不应是私有的。如果子级无法访问父级的方法,则在没有 @Override 注释的情况下覆盖该方法会将其视为新方法。
/* 返回类型 */
2- child 中的返回类型应该是相同的类或子类。
/* 异常 */
3- 如果父方法抛出检查异常,那么子方法可以: a- 抛出相同的异常或子类。b- 不抛出任何异常。c- 抛出运行时异常。
4- 如果父方法抛出未经检查的异常,那么子方法可以: a- 不抛出任何异常。b- 抛出运行时异常。
5- 如果parnet 的方法没有抛出异常,那么child 的方法可以: a- 不抛出任何异常。b- 抛出运行时异常。
因为您要覆盖一个方法,所以您必须将其定义为原型方法或更多。
当您覆盖子类方法时,可见性必须比父类更宽。
从宽到严的顺序:
公共 默认 保护 私有