Java方法的重写归纳篇
方法重写的定义:
- 对于方法的重写,我们在继承关系中存在方法重写,在子类继承父类之后,不满足父类提供的功能,子类对于父类继承过来的某些方法可以进行重写(覆盖),对于父类的一些行为进行扩展
tip:如果父类是抽象类时,要重写抽象类中的所有抽象方法
问题:父类都知道子类要重写这个方法了,为什么还多此一举的去定义这个方法?
- 对于普通类中的继承关系发生之后,定义重写方法为了满足多态的前提。
- 对于抽象类中的继承关系发生之后,定义重写方法为了让子类在设计的时候避免子类的随意性。
方法重写的条件:
- 方法重写的前提:
- 一定要发生继承关系
- 子类中的方法和父类中的方法同名
- 参数列表要一模一样
- 返回值类型一模一样
- 是否是重写方法的判定依据:
- 修饰符:子类>=父类【可见性越大我们称之为修饰符越大(public >protected>默认的>private)】
- 返回值:子类<=父类【如果是基本数据类型要一致,如果是引用类型子类<=父类】
- 参数列表:子类==父类【一模一样】
- 抛出异常:子类<=父类【子类抛出的异常类一定要小于或等于父类抛出异常类】
代码演示:
//以抽象父类举例
//抽象父类
abstract class Animals {
String place="房间";
// 父类中的方法被重写时,父类方法修饰符不可以用private
abstract void sing();
public void eat() {
System.out.println("在吃饭");
}
//父类中的方法重写后,子类的参数列表需要和父类一摸一样
public void method(String place) {
System.out.println("我在"+place+"看书");
}
}
//子类
class Dog extends Animals {
// 重写了父类中的方法
public void sing() {
System.out.println("小狗在汪汪的唱歌");
}
public void eat() {
System.out.println("我在吃骨头饭");
}
public void method(String place) {
System.out.println("我在"+place+"看书");
}
}
//子类
class Cat extends Animals {
// 重写了父类中的方法
protected void sing() {
System.out.println("小猫在喵喵的唱歌");
}
public void eat() {
System.out.println("我在吃猫粮");
}
public void method(String place) {
System.out.println("我在"+place+"看书");
}
}
//测试类
public class Test1 {
public static void main(String[] args) {
Dog one = new Dog();
function(one);
Cat two = new Cat();
function(two);
}
// 使用多态的特性,编译看左边,运行看右边
public static void function(Animals a) {// Animals a=new Dog();Animals a=new Cat();
a.sing();
a.eat();
a.method("房间");
}
}
//执行结果:
小狗在汪汪的唱歌
我在吃骨头饭
我在房间看书
小猫在喵喵的唱歌
我在吃猫粮
我在房间看书
返回值和抛出异常,后续在你写项目的时候会用到,在此,我就不举例说明,知道就可以