持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
方法继承、覆盖和加载
方法继承
一般情况下子类可以继承父类定义的一些方法。如果子类中存在名字和父类相同的方法,在子类中调用这些方法之前要加上super。另外,若子类中不存在名字与之相同的方法,则在子类中直接调用父类的方法即可--就是不需要使用super。
- 代码示例:
//在父类定义了三个方法
public class FatherClass{
public void fun1(){
System.out.println("我是父类方法1");
}
}
public void fun2(){
System.out.println("我是父类方法2");
}
}
public void fun3(){
System.out.println("我是父类方法3");
}
}
定义子类SonClass并继承FatherClass
//继承了func1()、func2(),重新定义了func3()、func4()、func5().
public class SonClass extends Fathers{
public void func2(){
super.func2();
System.out.print("子类,func2()");
}
public void fun4(){
super.func1();
func2();
System.out.println("子类,func4()");
}
public void func5(){
System.out.println("子类:func5()");
}
}
方法覆盖
如果子类中定义了一个方法,其名称、返回类型及参数列表正好与父类中某个方法的名称、返回类型及参数列表相匹配,那么可以说,子类的方法覆盖了父类的方法。
子类覆盖父类方法的条件
- 子类的方法名称、返回类型以及参数列表必须一致
- 子类方法不能缩小父类方法的访问权限
- 子类方法不能抛出比父类方法更多的异常
- 方法覆盖只存在于子类和父类之间,同一个类只能重载。
- Java静态虚拟机把静态方法和所属的类的绑定,把实例方法和所属的实例绑定
- 父类的静态方法不能被子类覆盖成为非静态方法
- 子类可以定义与父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法
- 父类的私有方法不能子类覆盖
- 父类的抽象方法可以被子类通过两种途径覆盖
- 父类的非抽象方法可以被覆盖为抽象方法
注: 当子类覆盖了父类方法时,如果子类方法或者子类对象调用该方法时,一般认为调用的方法是子类的方法。而如果要调用父类的同名方法,则在子类中需要加上super。
public class PaClass{
//定义三个方法
public void funcA(){
System.out.println("父类:A运行");
}
public void funcB(){
System.out.println("父类:B运行");
funcA();//调用A方法
System.out.println("父类:B结束");
}
public void funcC(){
System.out.println("父类:C运行");
System.out.println("父类:C结束");
}
}
//SuClass类
public void SuClass extends PaClass{
public void funcA(){
System.out.println("子类:A运行");
System.out.println("子类:A结束");
}
public void funcB(){
System.out.println("子类:B运行");
super.funcB();//调用父类的funcB()方法
System.out.println("子类:B结束");
}
public void funcC(){
System.out.println("子类:C运行");
funcA(); //调用子类的方法
System.out.println("子类,C结束")
}
}
在SuClass类中,定义了funcA()\funcB()\funcC()方法,覆盖了父类定义的三个方法。在SuClass类中的funcB()方法中,通过super修饰符调用了父类的funcB方法。再funC方法中未使用super,因此是调用它本身类的funcA方法。