昆明java培训
达内昆明广州春城路

18487146383

热门课程

覆写变长方法也循规蹈矩

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

昆明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程序员:警惕自增的陷阱

腾讯游戏Switch独立销量领先——昆明达内

达内java语言编程学以致用

苹果技术:A11芯片上新菜【达内培训】

达内培训之国产手机vivo领跑,小米再上榜

选择城市和中心
贵州省

广西省

海南省