当前位置: 首页 > 后端技术 > Java

覆盖(Override)与过载(Overload)

时间:2023-04-02 01:41:16 Java

Java覆盖(Override)与过载(Overload)覆盖(Override)覆盖是对子类允许访问父类的方法的实现过程的重写,既不返回值和形参都不能改变。即外壳不变,核心重写!重写的好处是子类可以根据需要定义自己的特定行为。也就是说,子类可以根据需要实现父类的方法。覆盖方法不能抛出新的已检查异常或比被覆盖方法声明的异常更宽的异常。例如:父类的一个方法声明了一个检查异常IOException,但是改写这个方法时不能抛出Exception,因为Exception是IOException的父类,只能抛出IOException的子类异常。在面向对象的原则中,覆盖意味着任何现有的方法都可以被覆盖。示例如下:TestDog.java文件代码:classAnimal{publicvoidmove(){System.out.println("Animalscanmove");}}classDogextendsAnimal{publicvoidmove(){System.out.println("Dogscanrunandwalk");}}publicclassTestDog{publicstaticvoidmain(Stringargs[]){Animala=newAnimal();//动物对象Animalb=newDog();//Dog对象a.move();//执行Animal类的方法b.move();//执行Dog类的方法}}上面例子的编译运行结果如下:Animals可以移动,狗可以跑和走。你可以在上面的例子中看到它请??注意,虽然b是Animal类型,但它运行Dog类的move方法。这是因为在编译阶段,只检查参数的引用类型。然而,在运行时,Java虚拟机(JVM)指定对象的类型并执行对象的方法。所以,在上面的例子中,之所以编译成功,是因为Animal类中有一个move方法,但是在运行时,运行的是具体对象的方法。考虑以下示例:TestDog.java文件代码:classAnimal{publicvoidmove(){System.out.println("Animalscanmove");}}classDogextendsAnimal{publicvoidmove(){System.out.println("Dogscanrunandwalk");}publicvoidbark(){System.out.println("Dogscanbark");}}publicclassTestDog{publicstaticvoidmain(Stringargs[]){Animala=新动物();//动物对象Animalb=newDog();//Dog对象a.move();//执行Animal类的b.move()方法;//执行b方法。bark();}}上面例子编译运行结果如下:TestDog.java:30:cannotfindsymbolsymbol:methodbark()location:classAnimalb.bark();^这个程序会抛出编译错误,因为b引用类型Animal没有bark方法。方法重写规则的参数列表必须与被覆盖方法的参数列表完全一致。返回类型可以和重写方法的返回类型不同,但必须是父类返回值的派生类(java5及之前版本的返回类型必须相同,java7及以后版本可以有所不同)。访问权限不能低于父类中重写方法的访问权限。例如:如果父类的一个方法声明为public,那么重写子类中的方法就不能声明为protected。超类的成员方法只能被其子类覆盖。不能重写声明为final的方法。声明为静态的方法不能被覆盖,但可以重新声明。如果子类和父类在同一个包中,那么子类可以覆盖父类的所有方法,除了声明为private和final的方法。如果子类和父类不在同一个包中,则子类只能覆盖父类声明为public和protected的非final方法。被覆盖的方法可以抛出任何非强制异常,无论被覆盖的方法是否抛出异常。但是,被覆盖的方法不能抛出新的强制性异常,或者比被覆盖的方法声明的范围更宽的强制性异常,反之亦然。构造函数不能被覆盖。如果你不能继承一个类,你就不能覆盖那个类的方法。