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();

ポリモーフィックメソッド呼び出しの4つの有効な例は何ですか?(4つ選択してください。)

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クラスを教えているアメリカの主要大学のTAです。これが、私が常にポリモーフィズムを生徒に説明する方法です。

ここで実際に起こっていることは2つあり、それらは非常に似ています。ポリモーフィズムと動的バインディングです。

ポリモーフィズムは、参照型とオブジェクト型が異なる場合と単純に定義されます。典型的な例は、Animal anim = new Dog();です。犬が動物を伸ばすと。animの参照タイプ(Animal)は、そのオブジェクトタイプ(Dog)とは異なるため、animはポリモーフィック参照です。

2番目の部分は動的バインディングです。これは、メソッド呼び出しを行うときに実際に実行されるメソッドと関係があります。動的バインディングとは、実際に実行されるメソッドが、参照型とオブジェクト型の間のクラス階層の最下位にあるメソッドであることを意味します。また、オブジェクトタイプに最も近いクラスに属するメソッドと考えることもできます。

クラス階層は、各クラスがその親クラスのブランチであることがわかるツリーです。Javaは単一継承であるため(C ++などでは複数のクラスを拡張できますが、Javaでは1つしか拡張できません)、クラス階層は通常ツリーです。インターフェイスと抽象クラスもクラス階層に含まれているため、インターフェイスが原因で必ずしもツリーであるとは限らないことに注意してください。

ポリモーフィズムと動的バインディングが頻繁に一緒に使用される理由は、ポリモーフィズムは動的バインディングなしではあまり意味がないためです。実行するメソッドを参照型ではなくオブジェクト型に依存させることができるのは、ポリモーフィズムの全体的なポイントです。

于 2009-12-24T23:59:15.280 に答える
0

a2()でオーバーライドされたを呼び出しているため、Aは有効ですBc1()メソッドがクラスに存在しないため、CはコンパイルすらしませんA。タイプと実際のインスタンスが同じであり、ポリモーフィズムを必要としないため、Eは無効です。同様に、他のオプションを考え出すことができます。

于 2009-12-24T23:57:38.467 に答える
0

この質問では、ポリモーフィックメソッド呼び出しは、それを呼び出すオブジェクトのタイプよりも継承チェーンの上位にあるオブジェクトに属するメソッドへの呼び出しであり、で記述またはオーバーロードされたメソッドではないように見えます。与えられたオブジェクトのクラス。

したがって、cとeは独自のクラス内のメソッドを呼び出しているため、チェーンの上位にあるクラスのメソッドを呼び出していません。つまり、オーバーロードされたバージョンを呼び出しています。

お役に立てれば。

于 2009-12-24T23:58:15.373 に答える