方法重写(overriding)
什么是重写(overriding):
方法重写也叫方法覆盖
子类根据需求对从父类继承的方法进行重新编写
重写时,可以用super.方法的方式来保留父类的方法
构造方法不能被重写
语法:
super.父类方法(非privite的方法)
方法重写总结:
至少两个类,有继承关系的父子类
方法重写时父子方法同名 同参 同返回值
重写方法不能比父类方法更严格的访问权限
super
super可以调用父类的有参无参构造方法
调用无参构造方法时:
子类的构造方法{ super.方法名(); }
调用有参构造方法时:
super.方法名(参数);
【传入的参数要和父类方法参数保持一致】
super关键字访问父类成员:
使用super关键字,super代表父类对象
super只能出现在子类的方法和构造方法中
super调用构造方法时,只能是第一句
super 不能访问父类的privite成员
super的使用
使用场景:
1.子类重写父类方法
2.在子类中定义了和父类同名的成员变量
3.子类会覆盖父类的同名成员变量,super可以使父类被屏蔽的成员可见
调用父类的父类的方法,使用super.方法名就可以
因为java只支持单根继承
一个类值能有一个直接父类
一个类可以有多个间接父类
例如:
public class Father {
String name = "father";
public void m1(){
System.out.println("father类的m1方法");
}
}
public class Son extends Father {
String name="son";
public void m1(){
System.out.println("son类的m1方法");
}
public void varTest(){
System.out.println(name);
System.out.println(super.name);//super 代表父类对象
super.m1();
}
public static void main(String[] args) {
Son son = new Son();
son.varTest();
son.m1();
}
}
结果:
继承关系中的构造方法
继承条件下构造方法的调用规则:
子类构造方法没有通过super显示调用父类的有参构造方法,也没有通过this 调用自身的其他构造方法:
系统默认调用父类的无参构造方法
子类构造方法通过super显示调用父类的有参构造方法:
执行父类相应的构造方法,而不执行父类的无参构造方法 子类构造方法通过this显示调用自身的其他构造方法,在相应的构造方法中应用以上两条规则
Over the all:
1、调用子类构造方法就会先执行父类的构造方法
2、如果不指定调用哪个构造方法,会默认调用父类的无参构造方法
3、如果通过this或super指定了,就会调用指定的构造方法
方法重写和方法重载的区别
方法重写规则:
方法名相同
参数列表相同
返回值类型相同或者是其子类
访问权限不能严于父类
父类的静态方法不能被子类覆盖为非静态方法,父类的非静态方法不能被子类覆盖为静态方法
子类可以定义与父类同名的静态方法,以便在子类中隐藏父类的静态方法
(注:静态方法中无法使用super)
父类的私有方法不能被子类覆盖
不能抛出比父类方法更多的异常
方法重写和方法重载对比: