1.存在的问题:父类的功能无法满足子类的需求。
解决方法:方法重写。
2.方法重写的前提:必须要存在继承的关系。
3.定义:子父类出现了同名的函数,这个现象我们就称作为方法的重写。
4.什么时候要使用方法的重写?
当父类的功能无法满足子类的需求时使用方法的重写。
5.方法重写要注意的事项:
(1)方法重写时, 子类的方法名与形参列表必须和父类一致。
(2)方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。
(3)方法重写时,子类的返回值类型必须要小于或者 等于父类的返回值类型。
比如:
class Animal{ //大的数据类型
}
class Fish extends Animal{ //Fish小的数据类型。
}
(4)方法重写时, 子类抛出的异常类型要小于或者等于父类抛出的异常类型。
Exception(最坏)
RuntimeException(小坏)
理解的话可以理解为一代要比一代好,比如父亲杀人放火,儿子偷鸡摸狗是好事;如果父亲偷鸡摸狗,儿子杀人放火是坏事。
注意:方法的重载是必须在一个类中,方法的重写是必须要存在继承关系。
(2)方法重载的要求
① 函数名要一致。
② 形参列表不一致(形参的个数或形参的类型不一致)
③ 与返回值类型无关。
6.注意区分方法的重载
(1)方法的重载:在一个类中 存在两个或者两个 以上的同名函数,称作为方法重载。
7.方法重写的特点:
(1)当子类重写了父类的函数,那么子类的对象如果调用该函数,一定调用的是重写过后的函数,可以通过super关键字进行父类的重写函数的调用。
(2)继承可以使得子类增强父类的方法。
8.实例:
(1)需求:使用Java类描述一下普通的学生,基础班的学生以及就业班的学生。所有的学生都会学习,但是学习的内容不一样,普通的学生学习马克思列宁主义,基础班的学生学习Javase,就业班的学生学习JavaEE。
(2)实例:
class Student {
String name;
//构造函数
public Student(String name){
this.name = name;
}
public void study(){
System.out.println(name+"学习马克思列宁主义");
}
}
//基础班的学生属于学生中的一种
class BaseStudent extends Student{
public BaseStudent(String name){
super(name); //指定调用父类构造函数
}
//重写
public void study(){
System.out.println(name+"学习Javase");
}
}
//就业班的学生也属于普通学生中的一种
class WorkStudent extends Student{
//构造函数
public WorkStudent(String name){
super(name);
}
//重写
public void study(){
System.out.println(name+"学习JavaEE");
}
}
class Demo1{
public static void main(String[] args){
BaseStudent s = new BaseStudent("张三");
s.study();
WorkStudent w = new WorkStudent("李四");
w.study();
}
}
(3)运行结果如下图所示:
注意:super.name是在子类和父类有同名的成员变量时才需要写,如果子类中没有和父类同名的成员变量,就不用写super.name,直接写name即可,如果子类中没有这个变量,那么会自动寻找父类的成员变量。