7

AとBの2つのクラスがある場合、

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

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

次の場合:A a1 = new B()a1.test()必要に応じて1ではなく2を返します。これは単なるJavaの癖ですか、それともこの動作の理由がありますか?

4

8 に答える 8

5

これはポリモーフィズムと呼ばれます。実行時に、「実際の」タイプ(この場合a1)に従って正しいメソッドが呼び出されます。B

ウィキペディアがうまく言っているように:

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

于 2012-09-04T15:31:22.213 に答える
4

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

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

于 2012-09-04T15:30:51.767 に答える
2

これはポリモーフィズムであり、より具体的にはJavaオーバーライドです。クラスBからクラスAのテストメソッドを呼び出す場合は、superを使用してスーパークラスメソッドを呼び出す必要があります。例えば:

public class B extends A{
   public int test() {
       return super.test();
}
于 2012-09-04T15:37:23.547 に答える
0

これは意図された動作です。クラスBのメソッドは、クラスAtest()のメソッドをオーバーライドしています。test()

于 2012-09-04T15:31:50.207 に答える
0

にとって

A a1 = new B();

a1実行時の実際の型であるBのオブジェクトを指しています。したがって、値はオブジェクトBから出力されます。

于 2012-09-04T15:33:03.773 に答える
0
A obj = new A();
obj.test()

1を返します

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

2を返します

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

2を返します

他の回答で述べられているように、これはポリモーフィズムがどのように機能するかです。

この投稿は物事を少し明確にするかもしれません

于 2012-09-04T15:33:47.497 に答える
0

Javaは動的バインディング(または遅延バインディング)を使用するため、のメソッドBは呼び出されますが、は呼び出されませんA。これは静的バインディングの反対です。ここに良い例があります。

于 2012-09-04T15:34:01.327 に答える
0

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

于 2012-09-04T15:35:22.253 に答える