私はJavaメソッドの呼び出しとは何かを理解しており、それを使用して多くの例を実践してきました。
このコンセプトの実際の状況や必要性を知りたいです。誰かがそれが使用される現実のシナリオを与えることができれば、そしてこの概念がそこになかったらどうなるでしょうか?
私はJavaメソッドの呼び出しとは何かを理解しており、それを使用して多くの例を実践してきました。
このコンセプトの実際の状況や必要性を知りたいです。誰かがそれが使用される現実のシナリオを与えることができれば、そしてこの概念がそこになかったらどうなるでしょうか?
これが例です。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()
実際の各クラスのが使用されます。つまり、通常、印刷出力ははるかに読みやすくなります。
OK、簡単な例を示しましょう。呼び出し元が提供するリストを埋めるメソッドを作成しています。
public void fill(List l) {
list.add("I just filled the list!");
}
ここで、1人の呼び出し元がリンクリストを使用したいと考えています。もう1つは、配列に基づくリストの実装を好みます。あなたが聞いたこともない、さらに多くのリスト実装を持つ他の発信者がいるでしょう。これらはまったく異なるオブジェクトです。仮想メソッドに依存せずにこれを実現するソリューションを提案します。
仮想メソッドがない場合、これは、型にメソッドを実装List
する必要があることを意味します。add
オーバーライドされたメソッドを持つサブタイプがある場合でもArrayList
、コンパイラー(およびランタイム!)は単にそのメソッドを無視し、のメソッドを使用しList
ます。同じインターフェースに準拠する異なる実装を使用することは不可能です。タイプのメソッドでのみ機能するため、List
メソッドでそのコード行を再利用することは不可能です。fill
List
ご覧のとおり、型階層の全体的な考え方はあまり意味がありません。interface
sとabstract class
esも存在できませんでした。Java全体は、仮想メソッドの1つの機能がなければ、シャードに分解されます。