改善Java程序建议6

建议6:覆写变长方法也循规蹈矩

覆写必须满足的条件:

  • 重写方法不能缩小访问权限。
  • 参数列表必须与重写方法相同。
  • 返回类型必须与重写方法的相同或是其子类。
  • 重写方法不能抛出新的异常,或者是超出父类范围的异常,但是可以抛出更少、更有限的异常,或者不抛出异常。
    参数列表相同包括:参数数量相同,类型相同,顺序相同。
    看下面代码:
public class Client {
    public static void main(String[] args) {
            //向上转型
            Base base = new Sub();
            base.fun(100, 50);
            //不转型
            Sub sub = new Sub();
            sub.fun(100, 50);
    }
}
//基类
class Base{
  void fun(int price,int... discounts){
            System.out.println("Base......fun");
  }
}

//子类,覆写父类方法
class Sub extends Base{
  @Override
  void fun(int price,int[] discounts){
            System.out.println("Sub......fun");
  }
}

编译不通过。

首先覆写是正确的, 因为父类的fun编译成字节码后的形参是一个int类型的形参加上一个int数组类型的形参,子类的参数列表也与此相同,所以覆写是正确的。

是sub.fun(100, 50)这条语句报错,提示找不到fun(int,int)方法。

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,766评论 18 399
  • 在多数情况下,初始化一个对象的最终步骤是去调用这个对象的构造方法。构造方法负责对象的初始化工作,为实例变量赋予合适...
    我是陈君本阅读 776评论 0 3
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,885评论 1 10
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,142评论 0 62
  • 白风没有食言,每天他都会给小红龙捎来好玩的故事,有的来自他所到之处真实发生的事情,有的是别人口中的趣事,随着...
    Hello羊咩咩阅读 336评论 2 2