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 细节概述
- 子类的方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。
- 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类
比如 父类返回类型是Object,子类方法返回类型是String - 子类方法不能缩小父类方法的访问权限,要按照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. 方法重写案例
- 编写一个Person类,包括属性/private(name、age),构造器、方法say(返回自我介绍的字符串)。
- 编写一个Student类,继承Person类,增加id、score属性/private,以及构造器,定义say方法(返回自我介绍的信息)。
- 在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());
}
}
本次内容结束咯,感谢阅读。