スーパークラスを使用して上記のようなサブクラスオブジェクトをインスタンス化する理由はなんですか?オブジェクトをインスタンス化することを学ぶ唯一の方法は、次のとおりです。スーパークラスを使用してサブクラスオブジェクトを初期化するJava
SubClass object = new SubClass();
私はJavaを学習しています。
スーパークラスを使用して上記のようなサブクラスオブジェクトをインスタンス化する理由はなんですか?オブジェクトをインスタンス化することを学ぶ唯一の方法は、次のとおりです。スーパークラスを使用してサブクラスオブジェクトを初期化するJava
SubClass object = new SubClass();
私はJavaを学習しています。
SuperClass
のインスタンスしか取らないメソッドがあります。はSuperClass
なので、のインスタンスを使用して、SuperClass
として扱うことができます。インタフェースでの作業時
同じ動作が使用されます。
多型の美しさだList someList = new ArrayList();
。それはあなたのコードの残りの部分を壊すことなく、クラスの内部の実装を変更することができます。
あなたがしていることは、コンパイル時に参照のタイプが何であるかをJVMに伝えるだけです。
最初のケースでは、オブジェクト参照にスーパークラスの静的型があると言っています。新しいサブクラスオブジェクトを作成するときには、サブクラスのIS-Aスーパークラスインスタンスが存在するため、その参照ポイントを持つことができます。
これを行う主な理由は、スーパークラスを必要とする関数呼び出しのためです。あなたはこの
public static void insert(SuperClass b) {
//do something
}
のようなメソッドを持つクラスA
を持っているとあなたが
A.insert(object);
を行うことができますしかし、あなたは
SubClass object new SubClass();
をすれば
SuperClass object = new SubClass();
を持っている場合
できません
A.insert(object);
あなたはこれを使用すると、冗長またはコピーしたコードを削減し、きれいなものを保持するのに役立ちます
public static void insert(SubClass b) {
//do something
}
に、このようなメソッドを追加しない限り。
これは、多型性として知られています。 は、次の例を想像してみて:play()
:
Musician musician = new Pianist();
または
Musician musician = new Drummer();
はMusician
クラスはメソッドを持っていると仮定します。あなたが演奏方法を呼んでも、ミュージシャンが誰であるかは関係ありません。ピアニストかドラマーかにかかわらず、決定された楽器をどのように演奏するかは、この場合、具体的なクラスに基づいています。
各具象クラス、そのplay()
メソッドを上書きし、自分でプレイすることができます:
例えばPianist
クラス:詳細についてはplay() { playsBeethoven(); }
、それはあなたが継承を使用主な理由の一つであり、継承http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
でそれを使用することを忘れないように、常に良いことだhttp://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
を確認してください。 SuperClassを抽象として扱い、コンパイル時に派生型を知る必要はなく、別のクラスで派生型を知る必要はありません。これにより、多型を使用して派生クラスのメソッドを呼び出す際に、SuperClassへの参照を使用できます。
これは、あなたは
することができます。)あなたはコンパイル時にタイプを知っている必要はありません、とあなたは派生型を作成し、いくつかのランタイムメソッドを持つように工場を作成します。 COM、GStreamer、DirectShow、Glibなどを考えてください。
b。)派生型のインスタンスでも、基本型参照を公開するだけで他のオブジェクトの複雑さを隠すことができます。オブジェクトを返すメソッドやオブジェクト参照を引数として考える方法について考えてみましょう。
c。)もっと多くの可能性がありますが、おそらく最も関連性の高い2つの用途です。
ここで重要なのは、 'SubClass' *は' SuperClass'です。 –
この動作はJava 8で変更されましたか?メソッドがスーパークラスのパラメータ 'void method(SuperClass param)'を取る場合をテストしましたが、メソッドのようにサブクラスインスタンス 'SubClass sub = new SubClass();'を呼び出すことができます(サブ); '。つまり、上向きの互換性が現在許可されていますか? –