您的位置:首页 > 其它

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

2011-03-11 00:55 134 查看
目标:

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

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

2.4.1 重写方法

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

public class Animal{
public void eat(){
System.out.println("Generic Animal Eating Generally");
}
}
class Horse extends Animal {
public void eat(){
System.out.println("Horse eating hay, oats, "+ "and horse treats");
}
}


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

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

public class TestAnimals{
public static void main(String[] args){
Animal a = new Animal();
Animal b = new Horse();
a.eat(); // Run the Animal version of eat()
b.eat(); // Run the Horse version of eat()
}
}

class Animal{
public void eat(){
System.out.println("Generic Animal Eating Generally");
}
}

class Horse extends Animal {
public void eat(){
System.out.println("Horse eating hay, oats, "+ "and horse treats");
}
public void buck(){

}
}


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

Animal c = new Horse();
c.buck() // Can't invoke buck();
// Animal class doesn't have that method


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

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

public class TestAnimals{
public static void main(String[] args){
Animal a = new Animal();
Animal b = new Horse();
a.eat();
b.eat();
}
}
class Animal{
public void eat(){
System.out.println("Generic Animal Eating Generally");
}
}
class Horse extends Animal {
private void eat(){
System.out.println("Horse eating hay, oats, "+ "and horse treats");
}
}


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

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

b.eat();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: