SCJP认证 第二章面向对象 2.4 重写和重载(1)

17 篇文章 0 订阅

目标:

1.5 给定一个代码示例,判断一个方法是否正确地重写或重载了另一个方法,并判断该方法的合法返回值(包括协变式返回值) 。

5.4 给定一个场景,编写代码,声明和/或调用重写或重载方法。编写代码,声明和/或调用超累、重写构造函数或重载构造函数。

 

2.4.1 重写方法

重写的主要好处是具有能够定义某个子类型特定行为的能力。下面的例子演示了Animal的Horse子类,他重写了eat()方法的Animal版本:

对于从超类继承的抽象方法,则没有选择余地。我们必须在子类中实现该方法,除非该子类也是抽象的。抽象方法必须通过具子类实现,但是这事实上是说具体子类重写了超累的抽象方法。因此,应该奖抽象方法看成必须重写的方法。

Animal类的创建者已经决定:出于多态性考虑,所有Animal子而立型都应该以一种唯一、特有的方式定义eat()方法。在多态性方面,当某个人具有Animal引用,且它引用的不是Animal实例,而是一个Animal子类实例时,调用程序就应该能够调用Animal引用上的eat()方法,但是实际的运行时对象(比如Horse实例) 将运行其自己特有的eat()方法。将eat()方法标识为抽象的,就等于Animal程序员向所有子类的开发人员说:“新的子类型使用eat()泛型方法没有任何意义,因此,你必须拿出自己的eat()方法实现!”下面是一个使用多态性的(非抽象的)例子:

 

在上面的代码中,TestAnimals类使用Animal引用来调用Horse对象上的方法。记住,当使用指向Animal的引用 时,编译器将只允许调用Animal类中的方法。给定上面的代码之后,下面的代码就是非法:

 为了重新进行迭代,编译器只会查看引用类型,而不会查看实例类型。多态性允许使用更抽象的超类型(包括接口) 引用来引用其子类型(包括接口实现)之一。

 

Note:重写方法不能有比重写方法更具限制性的访问修饰符(例如,不能将一个标志位public的方法重写为protected)()

如果该段代码通过编译(实际上它不会通过编译),那么下面语句将在运行时失败:

Animal b = new Horse(); // Animal ref, but a Horse object , so far so good

b.eat(); 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值