SCJP认证 第二章面向对象 2.4 重写和重载(1)
2011-03-11 00:55
134 查看
目标:
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();
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();
相关文章推荐
- php 面向对象的三大要素(封装、继承、多态)以及重写(override)和重载(overload)的举例说明
- 【设计模式】面向对象小结——重写与重载
- Java中面向对象的封装,继承,重载重写
- 面向对象5(方法的重载、重写、继承)
- 面向对象:多态 Polymorphism、重载、重写、继承
- Java基础第10讲-面向对象之方法的重写和重载
- Day2 面向对象(封装·继承·多态·重载·重写)
- PHP面向对象之重写与重载-129
- Java面向对象(构造器、访问控制、重写重载)
- java面向对象(四)之重写、重载
- 【面向对象】三重定义——重构、重写、重载
- java面向对象(四)之重写、重载
- SCJP认证 第二章 面向对象 2.4.2 重载方法(2)
- Java 重写(Override)与重载(Overload)——面向对象
- PHP面向对象之重写与重载
- 面向对象 -- 方法重写和方法重载,带上点抽象类
- 1.为什么需要继承?如何继承?继承到什么? 2.方法的重载与重写的区别 3.类型的自动转换和强制转换 4.子类特有的方法的调用规则 5.子类重写的方法的调用规则 6.多态的理解 7.面向对象的三大特征
- PHP面向对象之重写与重载
- Java 重写和重载区别——面向对象的多态性分析
- Java面向对象-9.重载和重写