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

继承中方法覆盖的多种约束:
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、父类的方法只能被子类覆盖一次,一个类中的方法可以被重载多次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值