2012-09-04 7 views
7

を使用しようとするとJavaの私は2つのクラス、AとBがある場合は親クラスのメソッド

public class A { 
    public int test() { 
     return 1; 
    } 
} 

public class B extends A{ 
    public int test() { 
     return 2; 
    } 
} 

私が行う場合は、サブクラスのメソッドを呼び出す:A a1 = new B()を、そしてa1.test()リターン2の代わりに、必要に応じて、1。 これはちょうどJavaの奇抜なものなのでしょうか、それとも何らかの理由がありますか?

+1

これは「動的バインディング」と呼ばれ、静的バインディングについても知っておく必要があります。メソッドの代わりにフィールドをオーバーライドしようとすると、少し難解になります。あなたはSOまたはgoogleでこれに関する多くの質問を見つけるでしょう。 –

答えて

3

いいえ、それは正しいです(多型性によるものです)。すべてのメソッド呼び出しは、参照型ではなくオブジェクトに対して動作します。

ここでオブジェクトのタイプはB,で、class Bのテストメソッドが呼び出されます。

+0

ありがとう、これは私が混乱していたものです。参照型に基づいた動作が期待されていました。 –

5

polymorphismと呼ばれます。実行時に正しいメソッドがa1の "実際の"タイプ、この場合はBで呼び出されます。ウィキペディアのよう

はうまくそれを置く:

業界における多型の主な用途は、(オブジェクト指向 プログラミング理論は)メソッド、フィールド、またはプロパティに対応するためのさまざまな タイプに属するオブジェクトの能力であります適切なタイプ固有の振る舞いに従って、それぞれ同じ名前の のコールを使用します。 プログラマ(およびプログラム)は、事前にオブジェクトの正確な型を と知る必要はないので、正確な動作は 実行時に決定されます(これは遅延バインディングまたは動的バインディングと呼ばれます)。

+0

+1多型 –

0

これは動作を意図したものです。クラスBの方法test()

A a1 = new B(); 
a1

のクラスA.

0

方法test()をオーバーライドされる実行時に実際のタイプであるBの物体の方を向いています。従って値がオブジェクトB.

0
A obj = new A(); 
obj.test() 

から印刷された1

A obj = new B(); 
obj.test() 

が返される2

B obj = new B(); 
obj.test() 

を返すであろう他の回答で述べたように、これはどのように2

が返され多型が働く。

Thisポストは明確

0

Javaは(またはが遅れを結合)結合ダイナミック使用ビット物事を行うことができるので、Bの方法はA、ないと呼ばれています。これは、静的バインディングの反対です。良い例はhereです。

0

オブジェクトはAと宣言しますが、インスタンスはBです。したがって、呼び出されるメソッドはクラスBからのものです。あなたがBのメソッドテストをコメントしてこのメ​​ソッドを呼び出す場合、BはAを拡張します(この場合AはBの親です)。この場合呼び出されるメソッドはAクラスのテストになり、1を返します。

2

これはpolymorphismであり、より具体的にはJava(登録商標)overridingである。クラスBのクラスAのテストメソッドを呼び出す場合は、superを使用してスーパークラスメソッドを呼び出す必要があります。例:

public class B extends A{ 
    public int test() { 
     return super.test(); 
} 
関連する問題