Java的方法重写/覆盖
基本介绍:
方法覆盖/重写(override)就是子类有一个方法,和父类的某个方法的名称,返回类型,参数一样,把么我们就说子类的这个方法覆盖了父类的方法
快速入门案例:
package com.overrideLearn.override;public class override01 {public static void main(String[] args) {Dog dog = new Dog();dog.cry();//输出Dog类中的cry}
}
class Animal{public void cry(){System.out.println("动物叫唤");}
}class Dog extends Animal{//Dog是Animal子类//Dog的cry方法和Animal的cry()定义形式一样(名称,返回类型,参数)//这时我们就说dog的cry方法重写了Animal的cry方法`public void cry(){System.out.println("小狗汪汪叫");}
}
注意事项和使用细节:
方法重写也叫方法覆盖,需满足下面条件
1.子类的方法的形参列表,方法名称 要和父类方法的形参列表,方法名称完全一致
2.子类方法的返回类型要和父类方法的返回类型一样,或者是父类返回类型的子类 比如 父类返回类型是Object,子类返回类型是String(小可以传大,大不能传小)
class Animal{public Animal cry(){System.out.println("动物叫唤");return null;}
}class Dog extends Animal{//Dog是Animal子类//Dog的cry方法和Animal的cry()定义形式一样(名称,返回类型,参数)//这时我们就说dog的cry方法重写了Animal的cry方法`public Animal cry(){System.out.println("小狗汪汪叫");return null;}
}
class Animal{public Object cry(){System.out.println("动物叫唤");return null;}
}class Dog extends Animal{//Dog是Animal子类//Dog的cry方法和Animal的cry()定义形式一样(名称,返回类型,参数)//这时我们就说dog的cry方法重写了Animal的cry方法`public String cry(){System.out.println("小狗汪汪叫");return null;}
}
3.子类方法不能缩小父类方法的访问权限
public > protected > 默认 > private
//这样可以:
class Animal{protected Object cry(){System.out.println("动物叫唤");return null;}
}class Dog extends Animal{//Dog是Animal子类//Dog的cry方法和Animal的cry()定义形式一样(名称,返回类型,参数)//这时我们就说dog的cry方法重写了Animal的cry方法`public Object cry(){System.out.println("小狗汪汪叫");return null;}
}
//这样不行:
class Animal{protected Object cry(){System.out.println("动物叫唤");return null;}
}class Dog extends Animal{//Dog是Animal子类//Dog的cry方法和Animal的cry()定义形式一样(名称,返回类型,参数)//这时我们就说dog的cry方法重写了Animal的cry方法`private Object cry(){System.out.println("小狗汪汪叫");return null;}
}
方法重写与方法重载的比较:
习题:
//编写一个Person类,包括属性/private(name,age),构造器,方法say(返回自我介绍的字符串) //编写一个Student类,继承Person类,增加id,score属性/private,以及构造器,定义say方法(返回自我介绍的信息) //在main中,分别创建Person和Student对象,调用say方法输出自我介绍
package com.overrideLearn.override;public class overrideExercise {public static void main(String[] args) {Student student = new Student("小明",18,"905273090",99);System.out.println(student.say());}
}
//编写一个Person类,包括属性/private(name,age),构造器,方法say(返回自我介绍的字符串)
//编写一个Student类,继承Person类,增加id,score属性/private,以及构造器,定义say方法(返回自我介绍的信息)
//在main中,分别创建Person和Student对象,调用say方法输出自我介绍
class Person{private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public String say(){return "我的名字是" + name + "我的年龄是" + age;}public String getName() {return name;}public int getAge() {return age;}
}class Student extends Person{private String id;private int score;public Student() {}public Student(String name, int age, String id, int score) {super(name, age);this.id = id;this.score = score;}public String say(){return "我的名字是" + getName() + " 我的年龄是" + getAge() + " 我的id是" + id + " 我的分数是" + score;}
}