课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > 覆写变长方法也循规蹈矩
  • 覆写变长方法也循规蹈矩

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-30

  • 昆明Java培训机构的老师知道,在JAVA中,子类覆写父类的中的方法很常见,这样做既可以修正bug,也可以提供扩展的业务功能支持,同时还符合开闭原则(Open-Closed Principle)。

    符合开闭原则(Open-Closed Principle)的主要特征:

    1.对于扩展是开放的(Open for extension)。这意味着模块的行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。

    2.对于修改是关闭的(Closed for modification)。对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。

    下面我们看一下覆写必须满足的条件:

    覆写方法不能缩小访问权限;

    参数列表必须与被覆写方法相同;

    返回类型必须与被重写方法的相同;

    重写方法不能抛出新的异常,或者超出父类范围的异常,但是可以抛出更少,更有限的异常,或者不抛出异常。

    看下面这段代码:

    1 public class Client6 {

    2    public static void main(String[] args) {

    3        //向上转型

    4        Base base = new Sub();

    5        base.fun(100, 50);

    6        //不转型

    7        Sub sub = new Sub();

    8        sub.fun(100, 50);

    9    }

    10 }

    11

    12 //基类

    13 class Base {

    14    void fun(int price, int... discounts) {

    15        System.out.println("Base......fun");

    16    }

    17 }

    18

    19 //子类,覆写父类方法

    20 class Sub extends Base {

    21    @Override

    22    void fun(int price, int[] discounts) {

    23        System.out.println("Sub......fun");

    24    }

    25 }

    该程序中sub.fun(100, 50)报错,提示找不到fun(int,int)方法。这太奇怪了:子类继承了父类的所有属性和方法,甭管是私有的还是公开的访问权限,同样的参数,同样的方法名,通过父类调用没有任何问题,通过子类调用,却编译不过,为啥?难到是没 继承下来?或者子类缩小了父类方法的前置条件?如果是这样,就不应该覆写,@Override就应该报错呀。

    事实上,base对象是把子类对象做了向上转型,形参列表由父类决定,由于是变长参数,在编译时,base.fun(100, 50);中的50这个实参会被编译器"猜测"而编译成"{50}"数组,再由子类Sub执行。我们再来看看直接调用子类的情况,这时编 器并不会把"50"座类型转换因为数组本身也是一个对象,编译器还没有聪明到要在两个没有继承关系的类之间转换,要知道JAVA是要求严格的类型匹配的,类型不匹配编译器自然就会拒绝执行,并给予错误提示。

    这是个特例,覆写的方法参数列表竟然与父类不相同,这违背了覆写的定义,并且会引发莫名其妙的错误。所以读者在对变长参数进行覆写时,如果要使用次类似的方法,请仔细想想是不是要一定如此。

    注意:覆写的方法参数与父类相同,不仅仅是类型、数量,还包括显示形式.

    了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

    推荐文章

上一篇:别让null值和空值威胁到变长方法

下一篇:java程序员:警惕自增的陷阱

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56