この質問が多く寄せられていることは承知していますが、私の見解では、通常の回答は満足のいくものとはほど遠いものです。
次のクラス階層が与えられた場合:
class SuperClass{}
class SubClass extends SuperClass{}
サブクラスをインスタンス化するために、なぜ人々はこのパターンを使用するのですか?
SuperClass instance = new SubClass();
これの代わりに:
SubClass instance = new SubClass();
さて、私が見る通常の答えは、これは、次instance
のような SuperClass のインスタンスを必要とするメソッドに引数として送信するためであるというものです。
void aFunction(SuperClass param){}
//somewhere else in the code...
...
aFunction(instance);
...
しかし、それを保持する変数の型に関係なく、SubClass のインスタンスを aFunction に送信できます! つまり、次のコードはエラーなしでコンパイルおよび実行されます (以前に提供された aFunction の定義を前提としています)。
SubClass instance = new SubClass();
aFunction(instance);
実際、私の知る限り、変数の型は実行時には意味がありません。それらはコンパイラによってのみ使用されます!
変数を SuperClass として定義する別の考えられる理由は、いくつかの異なるサブクラスがあり、変数が実行時にそれらのいくつかへの参照を切り替えることになっている場合ですが、たとえば、これがクラスで発生するのを見ただけです (スーパーではなく、サブではありません.ちょうどクラス)。一般的なパターンを必要とするのは間違いなく十分ではありません...