什么是重写
在子类中对父类方法进行改写或改造的现象称之为方法重写或方法覆盖。
为什么需要重写
重写,即在子类中重新改写父类中的方法,目的是为了准确的描述子类的行为特征,从而适应子类自身的需求。
如何进行重写
首先,重写必定是出现在子类中,通过‘@override’注解来修饰重写,从而可以在编译软件eclipse中判定重写是否正确。如若不写‘@override’则会被认为定义新方法。代码如下:
public class Father {//父类
String name="wjq";
String mobil;
String height;
public void work(){
System.out.println("正在敲代码");
}
}
public class Son extends Father{//子类
@Override
public void work(){
System.out.println("正在学习");
}
public static void main(String[] args) {
Son son = new Son();
son.work();
}
}
此时经过重写后输出的结果为 “正在学习” ,从而实现了对于方法的重写。
重写的注意事项
a.重写后的方法权限(public protected 默认 private)要么与父类的方法权限相同,要么比父类的方法权限范围大。特别的,如果父类中的方法权限为private,则子类无法继承,自然也无法进行重写。
代码举例为:
public class Father {//父类
String name="wjq";
String mobil;
String height;
void work(){
System.out.println("正在敲代码");
}
}
public class Son extends Father{//子类
@Override
public void work(){
System.out.println("正在写作业");
}
public static void main(String[] args) {
Son son = new Son();
son.work();
}
}
此时,父类中的访问权限为默认,则在子类中重写时,访问控制符可以使用public,protected和默认。
b.如果父类方法中的方法前有final修饰,则子类不允许被重写但可以被继承。
代码举例为:
public class Father {//父类
String name="wjq";
final void work(){
System.out.println("正在敲代码");
}
}
public class Son extends Father{//子类
@Override
public void work(){
System.out.println("正在写作业");
}
}
此时如果进行编译,则会出现报错,原因即为被final修饰的父类,不可被重写。
c.父类中如果有static修饰的方法,则子类不允许被重写,但可以被继承。
d.子类重写后的方法也不允许使用static修饰。
public class Father {//父类
String name="wjq";
static void work(){
System.out.println("正在敲代码");
}
}
public class Son extends Father{//子类
@Override
static void work(){
System.out.println("正在写作业");
}
}
public class Test{
public static void main(String[] args) {
Son son = new Son();
son.work();
}
}
由上面三段代码进行编译可发现,在Son函数中无法进行重写,且在子函数中不可含有static。原因是static为静态方法,如果在父类中含有静态static,在子类中无法被重写。
e.重写后的方法,方法名必须与父类的方法名相同,参数列表除不对参数名称做限制外,参数类型与参数个数必须与父类一一对应。
public class Father {//父类
String name="wjq";
public void work(String a){
System.out.println("正在敲代码");
}
}
public class Son extends Father{//子类
@Override
public void work(String a){
System.out.println("正在写作业");
}
}
public class Test{
public static void main(String[] args) {
String a;
Son son = new Son();
son.work(a);
}
}
此时,在Test中的son.work(a)括号中必须与所调用方法的形式相同。
f.返回值
(1)如果父类的返回值为void或者其他基本数据类型,则重写后的方法必须和父类的返回值类型相同。
public class Father {//父类
String name="wjq";
public void work(){
System.out.println("正在敲代码");
}
}
public class Son extends Father{//子类
@Override
public void work(){
System.out.println("正在写作业");
}
}
(2)如果父类的返回值为引用数据类型,则重写后的方法返回值要么与父类相同,要么是父类方法返回值的子类。
public class Father {//父类
Object name="wjq";
public void work(){
System.out.println("正在敲代码");
}
}
public class Son extends Father{//子类
@Override
public void work(){
System.out.println("正在写作业");
}
}
如代码所示,Object为所有类型的父类,则子类返回值类型可以为Object,也可以为Object的子类数据类型。