内容
方法的重载: 在同一个类中,出现多个同名的方法,参数列表不同,与返回值类型,修饰符无关
方法的重写: 子类中出现和父类中一模一样的方法(包括返回值类型,方法名,参数列表)
方法重写的注意事项:
- 重写的方法必须要和父类一模一样(包括返回值类型,方法名,参数列表)
- 重写的方法可以使用@Override注解来标识
- 子类中重写的方法的访问权限不能低于父类中方法的访问权限
权限修饰符 : private < 默认(什么都不写) < protected < public
抛出的异常:写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
为什么要重写方法:
-
当父类中的方法无法满足子类需求的时候,需要方法重写
-
当子类具有特有的功能的时候,就需要方法重写
重写的应用
子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。
有关static
如果父类中有一个静态的方法,子类也有一个与其方法名,参数类型,参数个数都一样的方法,并且也有static关键字修饰,那么该子类的方法会把原来继承过来的父类的方法隐藏,而不是重写。通俗的讲就是父类的方法和子类的方法是两个没有关系的方法,具体调用哪一个方法是看是哪个对象的引用;
用例
public class OverrideTest {
public static void main(String[] args) {
A b = new B();//父类引用指向子类对象
b.nonstaticMethod();//重写
b.staticMethod(); //重写不成功
}
}
class A{
static void staticMethod(){
System.out.println("类A的静态方法");
}
void nonstaticMethod(){
System.out.println("类A的非静态方法");
}
}
class B extends A{
static void staticMethod(){
System.out.println("类B的静态方法");
}
@Override
void nonstaticMethod() {
//super.nonstaticMethod();
System.out.println("类B的非静态方法");
}
}
写最后:父类引用指向子类对象,但是不能调用子类的独有的方法。类能调用的方法看左边的类。如上述代码A b = new B();b能调用的方法看A类中有没有。