重写
只与方法有关,与属性没有关系。
一、 方法重写的概念
方法的重写指的是在继承关系中,子类定义一个方法名,返回值(八大基本数据类型)和参数列表都和父类一样的方法,而这个方法内的方法体可以跟父类不一样,用以实现不一样的功能。可以这么理解,方法重写就是子类方法对父类原方法的覆盖。
值得注意的是,方法重写,从jdk 1.5开始,返回值类型不再要求是相同类型,放宽了这个限制,被重写的方法的返回值类型可以是其父类的子类。如:
class A{
public Object test(){
return;
}
}
class B extends A{
public String test(){ //重写中,返回父类的子类数据类型
return;
}
}
二、方法重写注意事项:
1. 必须是非静态方法,静态方法不叫重写
也就是说,方法的定义中,修饰符不能是private
,方法的重写只能出现在非静态方法中。
前面提过,static
静态方法跟随类加载而加载,创建对象是在类加载之后发生的
所以哪个类的对象就调用哪个类的静态方法,与后面赋值(地址引用无关),静态方法与重写无关。如:
// Animal.java(父类)
package com.zctou.oop.demo06;
public class Animal {
public static void run(){
System.out.println("动物在走!");
}
}
// Dog.java(子类)
package com.zctou.oop.demo06;
public class Dog extends Animal{
public static void run() {
System.out.println("小狗在跑!");
}
}
//Application.java
package com.zctou.oop;
import com.zctou.oop.demo06.Animal;
import com.zctou.oop.demo06.Dog;
public class Application {
public static void main(String[] args) {
Animal animal = new Dog(); //声明父类变量,创建子类对象并赋值
Dog dog = new Dog(); //声明子类变量,创建子类对象并赋值
animal.run();
dog.run();
}
}
//输出:
动物在走!
小狗在跑!
*可以看出,以上示例中,子类静态方法虽然与父类方法名,返回值,参数列表都一至,但并不能算方法重写。看下图,强行给静态方法加@Override
, IDEA会报错,说不是重写其父类方法。
2. 重写只能存在继承关系中
方法重写就是对父类方法的覆盖,所以没有继承就没有方法重写这一说法,只有子类能重写父类。
3. 注意方法重写与方法重载的区别
- 方法重写与方法重载不一样,重载是方法名必须一样,要参数列表必定不一样,修饰符和返回值不作要求。
而方法重写的方法名,参数列表,必须一样。返回值都必须是其(父类或父类的其他子类)的数据类型,除了修饰符,全方位覆盖。
- 方法重写的修饰符,权限只能从小变大=> public , protected, default, private, private 不能被继承,也就不能被重写。
- 方法重写的抛出的异常范围:只能从大范围到小范围。 ClassNotFoundException -> Exception.
方法重写一般带关键定
@Override
。方法定义 方法重写 方法重载 修饰符 权限(低 --> 高) 不作要求 返回类型 与父(类或父类的其他子类)数据类型相同 不作要求 访问参数列表 必须不一样 必须与父类一样 静态方法(static) 必须不能是带static 不作要求 异常 可删减,不能抛出范围更大的异常 不作要求
三、 重写的意义:
父类的功能不一定能满足子类的需求,或者父类包含的信息方法太广。 而当子类需要修改父类的一些方法,进而实现功能扩展,或者抛弃父类的一些功能,这时候方法重写的意义就出现了。
PS:
IDEA中,快捷批量重写方法的快捷键是:Alt + Insert ==>选择override。