继承之重写(覆盖)父类方法的约束总结

来源:互联网 发布:java 积分兑换商城 编辑:程序博客网 时间:2024/06/02 01:36

继承中方法覆盖的多种约束:
1子类方法名称,参数签名,必须和父类的一致 否则编译出错
2子类的方法不能缩小父类方法的权限否则会编译出错。原因:若子类缩小了父类的方法的权限,在父类的引用变量引用子类的实例的时候,则不能访问子类private修饰的方法

//父类public class Base(){    public void method(){};}//子类public class Sub extends Base(){    private void method(){};//编译出错    public void main(arg s){        Base base=new Sub();//父类的引用变量引用子类的实例        base.method();//根据动态绑定规则base引用的是子类的method方法,二子类的的method方法是private类型不能被base访问    }}

3 子类的方法不能比父类的方法抛出更多的异常,子类抛出的异常必须和父类相同:或者子类抛出的异常必须是父类异常的子类

//合法情况ExceptionBase 是ExceptionSub1,ExceptionSub2 ……的父类public class Base{    public void method()throws ExceptionBase{};}public class Sub1 extends Base{    public void method() throws Exceptionsub1{};}public class Sub2 extends Base{    public void method() throws Exceptionsub1,ExceptionSub2 {};}public class Sub3 extends Base{    public void method() throws ExceptionBase {};}//不合法情况public class Base{    public void method()throws ExceptionSub1{};}public class Sub1 extends Base{    public void method() throws Exceptionsub1{};}public class Sub2 extends Base{public void method() throws Exceptionsub1,ExceptionSub2 {};//不合法    编译出错                                                                                    //ExceptionSub2不是ExceptionSub1的子类抛出比父类更多的异常}public class Sub3 extends Base{    public void method() throws ExceptionBase {};//不合法,编译出错 }

4方法的覆盖只存在于子类和父类之间,同一个类里面的方法只能重载
5父类的静态方法不能被子类覆盖为非静态方法(不能去掉父类方法的static关键字)
6子类可以定义与父类的静态方法同名的静态方法,为了隐藏父类的静态方法(满足1,2,3条规则):带有static的方法 在子类自定义也类似于重写,但不是重写
7父类非静态方法不能覆盖为静态方法
8父类的非抽象方法可以被子类覆盖为抽象方法:加个abstract(前提子类为抽象类)
9父类private修饰的方法不能被子类重写
10父类的抽象方法子类可以通过两种方式重写
方式一:实现父类的抽象方法
方式二:重写声明该抽象方法(子类也必须是抽象类,否则不能这样声明 必须用方式一)

public class Base {    abstract void method1(){};    abstract void method1(){};}public class sub1 extends Base {    public void method1(){};//方式一    public abstract void method1(){};//编译出错}public abstract class sub2 extends Base {    public void method1(){};//方式一    public abstract void method1(){};//方式二正确}

重载要求(两个必须,两个非必须):
1、方法名必须相同
2、参数的类型,个数,顺序必须至少一个不同
3、返回类型可以不同
4、方法权限可以不同(修饰符)

重载和重写的异同:
相同:
1、都必须方法名相同
2、都可以用在抽象方法和非抽象方法之间
不同:
1、重写要求方法名称,参数签名,返回类型必须一致;重载只要求方法名一致
2、重写只能用于子类覆盖父类方法,重载用于一个类中所有方法,包括父类的
3、重写对于抛出异常和访问权限有特殊要求,重载则没有
4、父类的方法只能被子类覆盖一次,一个类中的方法可以被重载多次

阅读全文
0 0