我是Java新手,我正在学习基础知识。我正在研究toString
方法以及如何在我自己的类中覆盖它。我只是想知道为什么toString
为public
?是因为它是在Object
类中定义的吗?
答案 0 :(得分:28)
来自官方Oracle documentation:
<强>调节剂强>
覆盖方法的访问说明符可以允许比重写方法更多但不能更少的访问权限。例如,超类中的受保护实例方法可以在子类中公开,但不是私有的。
这是因为继承在两个类之间创建IS-A关系,Liskov substitution principle必须有效。没有先前可能无法执行的约束。
答案 1 :(得分:22)
想一想:你用MyGizmo继承了Gizmo。这意味着任何可以使用Gizmo的地方,都可以使用MyGizmo。如果某个程序gizmoObject.toString()
,那么即使gizmoObject不是Gizmo而是MyGizmo,它也应该有效。
特别是,toString
用于打印&amp;转储对象并需要在所有对象上访问。
答案 2 :(得分:14)
当覆盖任何方法时,覆盖的可见性必须至少与基本方法一样可见。
答案 3 :(得分:2)
当您覆盖任何方法时,覆盖的可见性必须等于或更多,而不是基本方法的可见性
答案 4 :(得分:1)
覆盖方法时,应该将重写方法的可见性声明为基类或更宽的方法。
这是关于我自己写的最重要规则的说明,作为对我的参考:
/ *访问修饰符* /
1-子项中的访问修饰符应相同或更大(序列: public - protected - default(package-private) - private)。访问 父级中的修饰符不应该是私有的。如果孩子没有访问权限 到父的方法,然后覆盖没有的方法 @Override注释会将其视为一种新方法。
/ *返回类型* /
2-孩子的回归类型应该是同一个班级或子班级。
/ *例外情况* /
3-如果父方法抛出检查异常,那么孩子的方法 方法可以:a-抛出相同的异常或子类。 b-不是 扔任何例外。 c-抛出运行时异常。
4-如果父方法抛出未经检查的异常,则该子进程抛出 方法可以:a-不抛出任何异常。 b-抛出运行时 异常。
5-如果parnet的方法没有抛出异常,那么孩子的 方法可以:a-不抛出任何异常。 b-抛出运行时 异常。
答案 5 :(得分:0)
因为您覆盖方法,所以必须将其定义为原型方法或更多。
答案 6 :(得分:0)
当覆盖子类方法时,可见性必须比父类宽。
更严格的订单:
公共 默认 保护 私人