15

私はJavaメソッドの呼び出しとは何かを理解しており、それを使用して多くの例を実践してきました。

このコンセプトの実際の状況や必要性を知りたいです。誰かがそれが使用される現実のシナリオを与えることができれば、そしてこの概念がそこになかったらどうなるでしょうか?

4

2 に答える 2

24

これが例です。2つのクラスがあるとします。

class A {
    public String getName() {
        return "A";
    }
}

class B extends A {
    public String getName() {
        return "B";
    }
}

ここで次のことを行う場合:

public static void main(String[] args) {
    A myA = new B();
    System.out.println(myA.getName());
}

結果が得られます

B

Javaにがなかった場合virtual method invocation、コンパイル時に、呼び出されるのはクラスgetName()に属するものであると判断されます。そうではありませんが、ポイントするA実際のクラスに応じて実行時にこれを決定するため、上記の結果が得られます。myA

[編集して(少し工夫された)例を追加]
この機能を使用してObject、引数として任意の数のsを取り、次のように出力するメソッドを作成できます。

public void printObjects(Object... objects) {
  for (Object o: objects) {
    System.out.println(o.toString());
  }
}

これは、オブジェクトの任意の組み合わせで機能します。Javaにがなかった場合、すべてのオブジェクトは、あまり読みvirtual method invocationにくいオブジェクトを使用して印刷されます。toString()代わりに、toString()実際の各クラスのが使用されます。つまり、通常、印刷出力ははるかに読みやすくなります。

于 2012-07-11T11:07:27.537 に答える
1

OK、簡単な例を示しましょう。呼び出し元が提供するリストを埋めるメソッドを作成しています。

public void fill(List l) {
  list.add("I just filled the list!");
}

ここで、1人の呼び出し元がリンクリストを使用したいと考えています。もう1つは、配列に基づくリストの実装を好みます。あなたが聞いたこともない、さらに多くのリスト実装を持つ他の発信者がいるでしょう。これらはまったく異なるオブジェクトです。仮想メソッドに依存せずにこれを実現するソリューションを提案します。

仮想メソッドがない場合、これは、型にメソッドを実装Listする必要があることを意味します。addオーバーライドされたメソッドを持つサブタイプがある場合でもArrayList、コンパイラー(およびランタイム!)は単にそのメソッドを無視し、のメソッドを使用しListます。同じインターフェースに準拠する異なる実装を使用することは不可能です。タイプのメソッドでのみ機能するため、Listメソッドでそのコード行を再利用することは不可能です。fillList

ご覧のとおり、型階層の全体的な考え方はあまり意味がありません。interfacesとabstract classesも存在できませんでした。Java全体は、仮想メソッドの1つの機能がなければ、シャードに分解されます。

于 2012-07-11T11:22:45.547 に答える