次のコードがあります。
import java.lang.*;
public class Program
{
public static void main(String [] args)
{
B a = new A();
a.p(10);
a.p(10.0);
}
}
class B {
public void p(double i)
{
System.out.println(i*2);
}
}
class A extends B{
public void p(int i)
{
System.out.println(i);
}
}
を使用してこのコードを実行するとB a = new A()
、両方のケースで 20.0 が得られます。オーバーロードは、コンパイラが宣言された型を調べて関数を適切に呼び出すコンパイル時に処理されるためです。宣言された型はクラス B だったので、どちらの場合もクラス B のメソッドが呼び出されました。もしそうならA a = new A();
、両方の答えで10を得るはずですが、そうではありません。a.p(10)
で 10と で 20.0 を取得していa.p(10.0)
ます。静的バインディングの概念と、実際の型ではなく宣言された型を見る静的バインディングによって行われるオーバーロードの全体的な概念に基づいて、なぜ結果がこのように出てくるのでしょうか? 大変お世話になりました。