diff --git "a/main/JAVA/1.1.4\351\207\215\345\206\231.md" "b/main/JAVA/1.1.4\351\207\215\345\206\231.md" index ee32891f3617e9008447330ee0f4b8b3ddcf477e..939ab50b3b7ec08a457b8039a7765491e63325bf 100644 --- "a/main/JAVA/1.1.4\351\207\215\345\206\231.md" +++ "b/main/JAVA/1.1.4\351\207\215\345\206\231.md" @@ -7,14 +7,14 @@ ## 重写的规则(属性也是可以被重写的) 1. 参数列表必须完全与被重写方法的相同; -2. 返回类型必须完全与被重写方法的返回类型相同; +2. 返回类型必须是被重写方法的返回类型的子类(协变返回类型:**子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更 "狭窄" 的类型,即子类**),或者相同; 3. 父类的方法必须能被继承,子类的访问权限必须大于父类中被重写的方法的访问权限(否则就是语法错误)。 6. 父类的方法不能为final,final是不允许被重写。 7. 父类的方法不能为static的方法,static表示类的一种修饰,而不是对象。 10. 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常(非强制异常米有关系只要不触及底线,爱咋玩咋玩)。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。(异常比较家当,老子的当家就只有这么多,不能超了) -## 问题 -`Object.clone()`方法子类重写的时候居然返回值居然可以写成`非Object`类型的,这一点很是奇怪。没明白。 +## 注意点 +`Object.clone()`方法子类重写的时候居然返回值居然可以写成`非Object`类型的。协变返回类型。`Object.clone()`是protected,子类定义为public,否则就无法正常使用 ## 代码示例 用一个Object.equals(Object o)来做为例子,来显示去重写和重载的区别,当然这个问题我曾经也犯过错。就是因为参数不同,本意为重写的,变成了重载。