Java方法重写

简介: 1.什么是方法重写2.方法重写的规则3.重写与重载的区别

1.什么是方法重写

重写(override,也称为覆盖):在子类中对父类中允许访问的方法实现过程进行重新编写,子类中方法的名称、返回值类型、参数列表与父类相同,只有方法体中的实现不同


2.方法重写的规则

1.子类在重写时,方法名、返回值类型、参数列表要与父类方法一致


例如:定义一个Animal类

publicclassAnimal {
publicvoidsleep(){
System.out.println("动物要睡觉");
    }
}


再定义一个Cat类继承Animal类,并重写其中的sleep方法

publicclassCatextendsAnimal{
@Overridepublicvoidsleep() {
System.out.println("猫要睡觉");
    }
}


注:在重写父类中的方法时,可以使用 @Override 注解来显示指示。在重写父类方法时,在方法前面加上 @Override 系统可以帮助我们检查方法的正确性。


当出现将方法名拼写错误或是返回值类型与父类不同等问题时,就会编译报错,提示无法构成重写


2.子类重写方法的访问限定符不能小于父类的访问限定符

classAnimal {
protectedvoidsleep(){
System.out.println("动物要睡觉");
    }
}
classCatextendsAnimal{
@Overridepublicvoidsleep() {
System.out.println("猫要睡觉");
    }
}


当子类中重写方法的访问限定符小于父类时,就会报错

10d3f5081edc465aad2630f772a1ce37.png

访问权限:private < default < protected < public

3.父类中被static、private、final修饰的方法以及构造方法都不能被重写


static:静态方法是通过类来调用的,而不是通过对象来调用的。若父类中有被static修饰的方法,且子类中也有一个方法名、返回值类型、参数列表与该方法都相同的静态方法,此时,父类与子类中的静态方法是两个没有关系的方法。当通过一个指向子类对象的父类引用变量来调用该静态方法时,只会调用父类的静态方法,因此static修饰的方法没办法达到重写的目的。


private:

classAnimal {
publicvoidshow(){
sleep();
    }
privatevoidsleep(){
System.out.println("动物要睡觉");
    }
}
classCatextendsAnimal{
//被private修饰的父类方法不能被重写,若加上@Override则会报错//@Overridepublicvoidsleep() {
System.out.println("猫要睡觉");
    }
}
publicclassTest {
publicstaticvoidmain(String[] args) {
Catcat=newCat();
cat.show();
    }
}


运行结果


aeac68ec4e394816847d4722e552c8e7.png

此时通过show方法调用的sleep方法为父类Animal中的方法,表明private修饰的sleep方法与子类中的sleep方法不构成重写,即父类与子类中的sleep方法是两个没有关系的方法,即private修饰的方法不能到达重写的目的。


final:当方法被final修饰时,该方法则为最终方法(即不能被重写)

2668613fe3064e65a4d95ff0985d77ce.png


构造方法:类的构造方法名必须与类名一致,假如父类的构造方法能够被子类重写,那么子类类名必须与父类类名相同,因此构造方法不能被重写

7413e2e1b2a84b10987d2b3b71c2e119.png


5.被重写的方法的返回值类型可以不同,但是必须具有父子类关系

classAnimal {
publicvoidsleep(){
System.out.println("动物要睡觉");
    }
}
classCatextendsAnimal{
@Overridepublicvoidsleep() {
System.out.println("猫要睡觉");
    }
}
classA{
publicAnimalfun(){
Animalan=newAnimal();
returnan;
    }
}
classBextendsA{
@OverridepublicCatfun() {
Catc=newCat();
returnc;
    }
}


父类A与子类B中的返回值类型虽然不同,但Animal与Cat是父子类关系,因此可以重写


4856b5231526411abdf7dcc0877d0374.png



3.重写与重载的区别

方法重写是子类与父类的一种多态性表现,而方法重载是一个类的多态性表现

区别 重写(override) 重载(overload)
参数列表 必须相同 必须不同

返回类型

必须相同(或构成父子类关系) 可以不同
访问限定符 子类不能低于父类(且父类方法不能被private修饰) 可以修改


目录
相关文章
|
1月前
|
Java 编译器
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
|
3月前
|
Java
java面试基础 -- 方法重载 & 方法重写
java面试基础 -- 方法重载 & 方法重写
21 0
|
3月前
|
Java
Java | 类、实例初始化 、方法重写规则
Java | 类、实例初始化 、方法重写规则
42 0
|
3月前
|
Java 编译器
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
34 0
|
3月前
|
Java 编译器
【Java 方法重写】@Override 注解,一般用法,重写的具体要求
【Java 方法重写】@Override 注解,一般用法,重写的具体要求
240 0
|
11月前
|
Java
JAVA_equals方法重写
JAVA_equals方法重写
39 0
|
Java
Java面向对象之方法重写详解
Java面向对象之方法重写详解
77 0
|
Java
【Java面向对象】方法重载,方法重写你还傻傻弄不清吗?
【Java面向对象】方法重载,方法重写你还傻傻弄不清吗?
73 0
|
Java
【Java面试宝典】常用类中的方法重写|equals方法与逻辑运算符==的区别
【Java面试宝典】常用类中的方法重写|equals方法与逻辑运算符==的区别
82 0
java202302java学习笔记第七天-方法重写2
java202302java学习笔记第七天-方法重写2
50 0
java202302java学习笔记第七天-方法重写2