1

对于 SCJP,大多数时候会询问如下问题以找到多态方法调用的有效示例。但是究竟应该寻找什么来发现它是否是多态使用?

 abstract class A {
   abstract void a1();
   void a2() { }

 }
 class B extends A {
   void a1() { }
   void a2() { }
 }
 class C extends B { 
   void c1() { }
 }

和:

 A x = new B();

 C y = new C(); 

 A z = new C();

多态方法调用的四个有效示例是什么?(选择四个。)

A. x.a2();

B. z.a2();

C. z.c1();

D. z.a1();

E. y.c1();

F. x.a1();

答案:A、B、D、F

4

4 回答 4

9

答案 C 不会编译(方法未在声明的类中定义)。答案 E 不是多态的(方法在声明的类中定义)。所有剩余的答案都使用一种方法,该方法要么被实现(来自抽象定义),要么被覆盖,要么被子类化(它们都是多态行为)。

这是一个概述:

A x = new B();
C y = new C(); 
A z = new C();

A. x.a2(); // Method is overriden.
B. z.a2(); // Method is inherited.
C. z.c1(); // Won't compile. Method isn't defined in A.
D. z.a1(); // Method is implemented.
E. y.c1(); // Not polymorphic. Method is defined in declared class C.
F. x.a1(); // Method is implemented.
于 2009-12-24T23:58:37.993 回答
8

我是美国一所主要大学的助教,教授 Java 课程,这就是我经常向我的学生解释多态性的方式:

这里实际上发生了两件事,它们非常相似:多态性和动态绑定。

多态被简单地定义为当引用类型和对象类型不同时。经典的例子是 Animal anim = new Dog(); 与狗延伸动物。动画 (Animal) 的引用类型与其对象类型 (Dog) 不同,因此动画是多态引用。

第二部分是动态绑定,它与调用方法时实际运行的方法有关。动态绑定意味着实际运行的方法是在引用类型和对象类型之间的类层次结构中最远的方法。您也可以将其视为最接近对象类型的类的方法。

类层次结构是您看到的树,其中每个类都是其父类的一个分支。由于 Java 是单继承(C++ 和其他允许您扩展多个类,但在 Java 中您只能扩展一个),类层次结构通常是一棵树。请记住,接口和抽象类也包含在类层次结构中,因此由于接口,它不一定是树。

多态性和动态绑定经常一起使用的原因是,如果没有动态绑定,多态性就没有多大意义。能够让运行的方法依赖于对象类型而不是引用类型是多态性的全部意义所在!

于 2009-12-24T23:59:15.280 回答
0

A 是有效的,因为您正在调用a2()已被覆盖的B. C 甚至不会编译,因为c1()类中不存在该方法A。E 无效,因为类型和实际实例相同,不需要多态。同样,您可以计算其他选项。

于 2009-12-24T23:57:38.467 回答
0

看起来,在这个问题中,多态方法调用是对属于在继承链中高于调用它的对象类型的对象的方法的调用,而不是在给定对象的类。

因此,由于 c 和 e 在它们自己的类中调用方法,它们并没有调用链上更高的类的方法——它们调用的是重载版本。

希望这可以帮助。

于 2009-12-24T23:58:15.373 回答