方法重写的意义
在java中,子类可以继承父类中的方法,而不需要重新编写相同的方法,但是有时子类并不想原封不动的继承父类方法,需要做一定的修改,这时候就需要使用方法重写
方法重写的定义
-
在继承的前提下
-
子类可以根据父类中继承的方法进行改写,也称为方法的重置/覆盖。
-
在程序执行时,子类的方法将覆盖父类的方法
方法重写的要求
-
子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
-
子类重写的方法的返回值类型不能大于父类被重写的方法返回值类型
- 父类被重写的方法的返回值类型是void,则子类重写的方法返回值只能是void
- 父类被重写的方法的返回值类型是A类型,则子类重写的方法返回值类型可以是A类或A类的子类
- 父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值类型必须是相同的
-
子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
- 如果父类为private,子类不能重写
- 如果父类为protected,子类不能是private
- 如果父类为public,子类不能是private和protected
-
子类不能重写父类中声明的private权限的方法
-
子类方法抛出的异常不能大于父类被重写方法的异常
注意事项:
-
子类与父类中同名同参数的方法必须同时声明为非static的,这样称作重写
-
子类与父类中同名同参数的方法为static的不是重写,因为static方法是属于类的,子类无法覆盖父类的方法
重写中访问权限问题
问题1:
class Car{int speed;public void show() {System.out.println("小车");}//普通车速最高200码,我现在不想给外部看到private void Addspeed(int speed) {for(this.speed=speed;speed<=200;speed+=10) {this.speed=speed;System.out.println(this.speed);}}
}
class Bwm extends Car{public void show() {System.out.println("宝马");}//重写父类的方法--实际不是重写private void Addspeed(int speed) {for(this.speed=speed;speed<=400;speed+=20) {this.speed=speed;System.out.println(this.speed);}}
}
其实这个不是重写
ClassLoader会生成子类和父类的类模板,子类找不到的方法会在父类中去找,而父类设置了私有的方法,子类就没办法访问,这个时候子类定义的这个方法就不是重写了,而是一个新方法
所以子类重写父类的那个需要被重写的方法必须保证子类可以访问父类的被重写方法
问题2:
class Car{int speed;public void show() {System.out.println("小车");}//普通车速最高200码,我现在不想给外部看到 ps:请不要挑车速的毛病,看问题protected void Addspeed(int speed) {for(this.speed=speed;speed<=200;speed+=10) {this.speed=speed;System.out.println(this.speed);}}public void method() {Addspeed(speed);}
}
class Bwm extends Car{public void show() {System.out.println("宝马");}//那宝马的车速是比普通的车速快,我就想重写这个加速的方法public void Addspeed(int speed) {//public比protected访问权限大,反过来就会报错for(this.speed=speed;speed<=400;speed+=20) {this.speed=speed;System.out.println(this.speed);}}
}
实际的继承关系:
是Student可以访问父类的资源,而不是复制
对比重载参考:Java重载