[英]Why my overriding method of toString() has to be public?
我是Java新手,我正在学习基础知识。 我正在研究toString
方法以及如何在我自己的类中覆盖它。 我只是想知道为什么toString
是public
? 是因为它是在Object
类中定义的吗?
从官方Oracle 文档 :
修饰符
覆盖方法的访问说明符可以允许比重写方法更多但不是更少的访问 。 例如,超类中的受保护实例方法可以在子类中公开,但不是私有的。
这是因为继承在两个类之间创建了一个IS-A关系, Liskov替换原则必须是有效的。 没有先前可能无法执行的约束。
想想看:你用MyGizmo继承了Gizmo。 这意味着任何可以使用Gizmo的地方,都可以使用MyGizmo。 如果某个程序执行gizmoObject.toString()
那么即使gizmoObject不是Gizmo而是MyGizmo,它也应该有效。
特别是, toString
用于打印和转储对象,并且需要可以在所有对象上访问。
覆盖任何方法时,覆盖的可见性必须至少与基本方法一样可见。
当你重写任何方法,在覆盖的能见度必须大于基方法的可见性等于或以上
覆盖方法时,应将覆盖方法的可见性声明为基类中的可见性或更宽。
这是关于我自己写的最重要规则的说明,作为对我的参考:
/ *访问修饰符* /
1-子级中的访问修饰符应相同或更大(序列:public - protected - default(package-private) - private)。 父级中的访问修饰符不应该是私有的。 如果孩子无法访问父方法,则在没有@Override注释的情况下覆盖该方法会将其视为新方法。
/ *退货类型* /
2-子类中的返回类型应该是同一个类或子类。
/ *例外* /
3-如果父方法抛出了检查异常,那么子方法可以:a-抛出相同的异常或子类。 b-不要抛出任何例外。 c-抛出运行时异常。
4-如果父方法抛出未经检查的异常,则子方法可以:a-不抛出任何异常。 b-抛出运行时异常。
5-如果parnet的方法没有抛出异常,那么子方法可以:a-不抛出任何异常。 b-抛出运行时异常。
因为要覆盖方法,所以必须将其定义为原型方法或更多。
当您重写子类方法时,可见性必须比父类宽。
更严格的订单:
公共默认保护私人
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.