关于Java中方法的重写(Override)

在java中,子类的非静态成员方法可以重写(Override)父类中的对应的方法。在使用父类引用调用相应的方法时,会根据运行时引用所指向的对象的实际类型动态调用子类或父类对应的方法,这就是多态了。软件构造课的考试题中有这样的题:

考察什么是正确的重写。

在java中,我们使用@Override注解让编译器为我们检查是否正确重写,编写子类时也是用IDE直接生成代码,因此有些细节就没有注意到,这里记录一下。

0. 根据LSP规则,子类类型也是父类类型,需要父类类型的地方子类类型可以顶上去。因此,通过父类引用动态调用方法,调用的子类方法必须是兼容的。

1. private方法不能参与重写。private完全是仅本类可见的,自然不能被其他类(包括子类、父类)感知,动态调用之类的显然也不行了。

2. 子类方法或不throws任何异常,或throws父类方法所声明的那些异常。子类方法throws的异常类型可以是父类方法throws的异常类型的子类型,这很好理解,父类方法要求throws Exception,子类方法throws IOException,IOException也是EXception,因此子类方法满足了要求。

3. 子类方法返回值类型必须也是父类方法返回值类型。也就是说,子类方法或返回一样的类型,或返回父类方法返回类型的子类型。这也很好理解,父类方法return Number,子类方法return Double,Double也是Number,因此子类方法满足了要求。

4. 理论上,根据LSP,还可以允许子类方法的参数类型是父类方法参数类型的父类型。即子类方法(List<?> scores)父类方法(ArrayList<?> scores),因为ArrayList<?>也是List<?>,参数传递起来是兼容的。实际上,在java中不允许这种重写。这某种意义上说与java的另一个特性是有关的,即重载:java允许一系列同名但参数类型不完全相同的方法写在一个类,并在编译阶段根据实参类型确定某段代码中调用的一系列重载方法究竟是哪一个。如果允许前面说的这种重写,就会出现子类中可以有多个方法重写父类方法,这不是乱套了?因此java不允许这种重写。其实这一问题可以有多种方法解决,比如增加某种关键字,在子类中明确指定哪个方法重写父类的哪个方法,但是这样非常不简洁。实际上,java采用重写加重载可以达到类似的效果,即用子类方法(ArrayList<?> scores)重写父类方法(ArrayList<?> scores),然后子类方法(ArrayList<?> scores)直接调用另一个重载子类方法(List<?> scores),实际效果相当于子类方法(List<?> scores)重写父类方法(ArrayList<?> scores)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值