美文网首页
覆盖与重载

覆盖与重载

作者: 三变粥 | 来源:发表于2017-08-05 14:32 被阅读0次

    重载(overload)

    对于类的方法(包括从父类中继承的方法),方法名相同、参数列表不同的方法之间就构成了重载关系。

    参数列表

    参数列表又叫做参数签名,指:参数的类型、参数的个数、参数的顺序。这三者只要有一个不同就叫做参数列表不同。

    重载关系只能发生在一个类中吗?

    子类中的某个方法和父类中继承下来的方法,也可能构成重载的关系。

    看方法之间是否是重载关系,不用管方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。而且要记住,构造器也可以重载。

    覆盖(override)也叫重写

    在当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆盖了之后,除非用super关键字,否则就无法再调用了。

    发生覆盖的条件

    1. 子类和父类的方法名称、参数列表、返回类型三者必须完全相同。而且子类方法的访问修饰符的权限不能比父类低。
    2. 子类方法不能抛出比父类方法还多的异常。即子类方法锁抛出的异常必须和父类方法所抛出的异常一致,或者是其子类,或者什么也不抛出。
    3. 被覆盖的方法不能是final类型的
    4. 被覆盖的方法不能为private。否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
    5. 被覆盖的方法不能为static。所以如果父类中的方法是静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误;如果父类和子类的方法都是静态的,仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
    public class PartnerService {
    
        public static int overrideFunc(){
    
            return 110;
        }
    }
    
    public class SonService extends PartnerService {
    
        public static void main(String[] args) {
            int son = overrideFunc();
            System.out.println(son); //0
            int par = PartnerService.overrideFunc();
            System.out.println(par); //110
        }
    
    
        public static int overrideFunc(){
    
            return 0;
        }
    }
    

    覆盖与重载的相同点

    1. 都要求方法同名
    2. 都可以用于抽象方法与非抽象方法之间

    覆盖与重载的区别

    1. 方法覆盖,要求参数列表完全一致,而方法重载要求参数列表必须不一致。
    2. 方法覆盖,要求返回类型完全一致,方法重载对此没有要求。
    3. 方法覆盖,只能用于子类覆盖父类的方法,方法重载用于同一类中的所有方法(包括从父类中继承而来的方法)
    4. 方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制
    5. 父类的一个方法只能被子类重载一次,而一个方法可以再所有类中被重载多次。
    6. 对于属性(成员变量)而言,是不能重载的,只能覆盖。

    相关文章

      网友评论

          本文标题:覆盖与重载

          本文链接:https://www.haomeiwen.com/subject/ouoilxtx.html