重写(Overriding)
什么是重写? 在Java中一个子类继承一个父类,这就有了继承关系,子类就拥有了父类的所有非私有化的属性、方法、构造函数的使用权。当子类需要修改父类的一些方法进行扩展,增大功能,这种方式就叫做方法的重写。
例子
/**
* 动物类
*/
class Animal {
public void out() {
System.out.println("this is Animal!");
}
}
/**
* 狗类
* 继承动物类
*/
class Dog extends Animal{
public void out() {
System.out.println("this is dog!");
}
}
public static void main(String[] args) {
//new 动物类
Animal animal = new Animal();
animal.out();
//new 狗类
Animal dog = new Dog();
dog.out();
}
//输出结果
//this is Animal!
//this is dog!
重写规则
- 参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
- 返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
- 访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
- 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如: 父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
重载(Overloading)
Java中方法的重载是指在一个类中有多个方法,它们具有相同的名字,不同的参数(数据类型、参数个数、顺序)。这就是方法的重载,当调用方调用同名方法时,通过传入不同的参数而区分调用哪个方法,这就是多态性。
例子
/**
* 狗类
*/
public class Dog extends Animal {
public void out(String name, String age) {
System.out.println("这只狗狗的名字叫做:" + name + ",它今年有:" + age + "岁啦!");
}
public void out(String name, String age, String action) {
System.out.println("这只狗狗的名字叫做:" + name + ",它今年有:" + age + "岁啦!" + "它正在" + action+"!");
}
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.out("小黑", "3");
dog.out("小黑", "3", "晒太阳");
}
//输出结果
//这只狗狗的名字叫做:小黑,它今年有:3岁啦!
//这只狗狗的名字叫做:小黑,它今年有:3岁啦!它正在晒太阳
重载规则
- 必须具有不同的参数列表;(数据类型、参数个数、顺序)
- 可以有不同的返回类型,只要参数列表不同就可以了;
- 可以有不同的访问修饰符;
- 可以抛出不同的异常;
重载和重写的区别
区别点 | 重载方法 | 重写方法 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
访问修饰符
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
private | √ | |||
默认(default) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
文尾
文章均为学习阶段记录笔记,若有不妥请留言指正。谢谢!