一口气理解方法重写/覆盖(override)

本文详细介绍了Java中的方法重写概念,涉及重写形式、使用细节(形参、返回类型和访问权限),并通过Person和Student类的实例展示了方法重写的应用。同时,文章还对比了方法重写与方法重载的区别。
摘要由CSDN通过智能技术生成

1. 基本介绍

1.1 方法重写概念

方法重写就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法。

1.2 方法重写的形式

public class Animal {
    public void cry(){
        System.out.println("动物叫");
    }
}

public class Dog extends Animal {
    public void cry(){
        System.out.println("小狗汪汪叫");
    }
}

因为Dog是Animal的子类,
Dog的cry方法和Animal的cry方法定义形式一样(名称 返回类型 参数,
这时我们就说Dog的cry方法重写了Animal的cry方法。

2. 方法重写的使用细节

2.1 细节概述

  1. 子类的方法的形参列表方法名称,要和父类方法的形参列表方法名称完全一样。
  2. 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类
    比如 父类返回类型是Object,子类方法返回类型是String
  3. 子类方法不能缩小父类方法的访问权限,要按照public -> protected -> 默认 ->private 的顺序

2.2 细节概述的案例演示

2.2.1 第一细节演示

public class Animal {
    public void cry(){    
    }
}

public class Dog extends Animal {
    public void cry(){
    }
}

父类和子类cry()方法的方法名(cry)及括号里的形参要保持一致,无参也行。

2.2.2 第二细节演示

public class Animal {
    public Object cry(){
}
    // public void cry(){    
    // }
}

public class Dog extends Animal {
    public String cry(){
}
    //public void cry(){
    //}
}

因为Dog类继承了Animal类,所以在方法重写时,子类方法的返回类型和父类方法返回类型一样,例如上图代码中注释掉的void类型。

或者子类方法的返回类型是父类返回类型的子类,例如上图代码中的Object和String类型。

若父类方法的返回类型是子类方法返回类型的子类,如以下代码展示。就会报错,

public class Animal {
    public String cry(){
    }    
}

public class Dog extends Animal {
    public Obejct cry(){
    }
}

报错信息如下:意为尝试使用不兼容的返回类型。

2.2.3 第三细节演示

子类方法的权限范围不能大于等于父类方法的权限范围。若子类方法的权限缩小则会报错,如下代码及错误信息提示。

public class Animal {
    public void cry(){    
    }
}

private class Dog extends Animal {
    public void cry(){
    }
}

3. 方法重写和方法重载的比较

4. 方法重写案例

  1. 编写一个Person类,包括属性/private(name、age),构造器、方法say(返回自我介绍的字符串)。
  2. 编写一个Student类,继承Person类,增加id、score属性/private,以及构造器,定义say方法(返回自我介绍的信息)。
  3. 在main中,分别创建Person和Student对象,调用say方法输出自我介绍 代码

4.1 person类

public class person {
    private String name;
    private int age;

    public person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String say(){
        return "姓名=" + name + " 年龄=" + age;
    }
}

4.2 student类

public class Student extends person{
    private int ID;
    private int score;

    public Student(String name, int age, int ID, int score) {
        super(name, age);
        this.ID = ID;
        this.score = score;
    }

    public String say(){
        //return "姓名=" + getName() + " 年龄" + getAge()+" ID="+ ID +" 分数="+score;
        //下面的方法会更简洁一点
        return super.say()+" ID="+ ID +" 分数="+score;
    }
}

4.3 test类

public class test {
    public static void main(String[] args) {
        person person = new person("jack",18);
        Student student = new Student("kevin",12,101,80);
        System.out.println(person.say());
        System.out.println(student.say());
    }
}

本次内容结束咯,感谢阅读。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值