一、基本介绍
简单的说:方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法。
注意这里的子类和父类不一定是直属的关系,可能是(Son–extends–>Father–extends–>Grandpa)
二、注意事项
- 子类的方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。
- 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类。
比如父类返回类型是 Object,子类方法返回类型是String。
【案例】
class Animal {
public Base test01() {
Base base1 = new Base();
return base1;
}
}
class Dog extends Animal {
public Sub test01() {
Sub sub = new Sub();
return sub;
}
}
class Base {
}
class Sub extends Base {
}
- 子类方法不能缩小父类方法的访问权限。
public > protected >默认>private
【案例】
Dog类中的cry()的访问修饰符,只能是public,必须要比父类Animal中的范围大。
class Animal {
public void cry() {
System.out.println("动物喊叫。");
}
}
class Dog extends Animal {
public void cry() {
System.out.println("小狗汪汪。");
}
}
class Animal {
protected void cry() {
System.out.println("动物喊叫。");
}
}
class Dog extends Animal {
public void cry() {
System.out.println("小狗汪汪。");
}
}
三、习题
1、比较重写和重载
2、练习
1.编写一个Person类,包括属性/private (name、age),构造器、方法say(返回自我介绍的字符串)。
2.编写一个Student类,继承Person类,增加id、score属性/private,以及构造器,定义say方法(返回自我介绍的信息)。
3.在main中,分别创建Person和Student对象,调用say方法输出自我介绍。
public class OverrideExercise {
public static void main(String[] args) {
Person p = new Person("p",100);
System.out.println(p.say());
Student stu = new Student("stu",12,12345,88.5);
System.out.println(stu.say());
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
setAge(age);
setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String say() {
return "name=" + getName() + ", age=" + getAge();
}
}
class Student extends Person {
private int id;
private double score;
public Student(String name, int age, int id, double score) {
super(name, age);
setId(id);
setScore(score);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String say() {
return super.say() + ", id=" + getId() + ", score="+getScore();
}
}