重写(Override):在继承关系当中,方法的名称一样,参数列表也一样。
重载(Overload):方法的名称一样,但参数列表不一样。
@Overide:写在方法前面,用来检测是不是有效的覆盖重写。
//创建父类
class Fu {
public void methodFu(){ //定义父类方法
System.out.println("父类方法执行!");
}
}
//创建子类
class Zi extends Fu{
public void methodZi(){ //定义子类方法
System.out.println("子类方法执行!");
}
@Override //判断是否为有效的覆盖重写
public void methodFu(){ //重写父类方法
System.out.println("重写成功!");
}
}
public class Main {
public static void main(String[] args) {
Zi zi = new Zi();
Fu fu = new Fu();
zi.methodFu(); //调用子类的父类覆盖重写方法
zi.methodZi(); //调用子类的子类方法
}
}
运行结果为:
一、重写的注意事项:
1.子类方法的返回值必须小于等于父类方法的返回值范围。
此时可以看到重写部分的Object报错
2.子类方法的权限必须大于等于父类方法的权限修饰符。
public > protected > (default)> private
// default 不是关键字,而是留空不写
子类重写的protected小于public,报错
二、构造方法:
1.子类构造方法当中有一个默认隐含的“super”调用,所以一定先调用的父类构造,后执行的子类构造。
//创建父类
class Fu {
public Fu(){ //定义父类方法
System.out.println("父类构造方法!");
}
}
//创建子类
class Zi extends Fu{
public Zi(){ //定义子类方法
System.out.println("子类构造方法!");
}
}
public class Main {
public static void main(String[] args) {
Zi zi = new Zi(); //先运行父类,再运行子类
}
}
运行结果为:
2.子类构造可以通过super关键字来调用父类重载构造。
此时就是用super去调用父类重载方法
3.super的父类构造调用,必须是子类构造方法的第一个语句。
此时将super放在第二句位置,就会发生报错
此时是父类有两种构造方法,但不能同时调用两个super,第二个super不满足在第一个语句的条件
4.只有子类构造方法,才能调用父类构造方法。
因为第二个子类方法不是子类的构造方法,所以不能调用父类构造方法
总结:子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super只能一个且必须是第一个。
三、super关键字的三种用法(用来访问父类内容):
1.在子类的成员方法中,访问父类的成员变量。
2.在子类的成员方法中,访问父类的成员方法。
3.在子类的构造方法中,访问父类的构造方法。
四、this关键字的三种用法(用来访问本类内容):
1.在本类的成员方法中,访问本类的成员变量。
2.在本类的成员方法中,访问本类的另一个成员方法。
3.在本类的构造方法中,访问本类的另一个构造方法。
this调用必须是构造方法的第一个语句,唯一一个;因此super和this两种构造调用不能同时使用。