2

これらのクラスからオブジェクトを作成するときに、ポリモーフィズムやクラスの拡張などがJavaでどのように機能するかについて、私は少し混乱しています。

私は最近、ここの誰かが解決するのを手伝ってくれた問題を抱えていました (オブジェクト サブクラスの変数にアクセスできませんか? (Java / Android)を参照)。

私は次のようなオブジェクトを作成しようとしていました:

Quad hero = new Hero();

Hero は Quad(); のサブクラスでした。

Hero クラスには、アクセスできない変数がありました。

解決策は、オブジェクトの作成を次のように変更することでした。

Hero hero = new Hero();

これを行うと、ヒーロー オブジェクトを介して、Quad クラスと Hero クラスの両方のすべてのメソッドと変数にアクセスできました。

私の質問は今です - これはなぜですか?

そして、これを念頭に置いて、いつ私の元の方法を使用すると便利でしょうか:

Quad hero = new Hero();

ヒーローもクワッドなので、それは私には理にかなっています。このタイプの宣言は、Java コードの例で何度も見たことがあり、理解していると思っていましたが、最近の出来事でそうではないことが証明されました。

誰かが私のためにこれを説明できればありがたいです - ありがとう

4

3 に答える 3

4

異なる動作を持つOtherHeroのサブクラスでもあると仮定します。Quad

これはうまくいきます:

Quad hero = new Hero();
// some code
hero = new OtherHero();

一方、以下はコンパイルされません:

Hero hero = new Hero();
// some code
hero = new OtherHero();

これは役に立たないようです。Quadここで、戻り値の型を持つメソッドがあるとします。疑似コードで書きます:

Quad method() {
    if (condition)
        return new Hero();
    else
        return new OtherHero();
}

Heroしたがって、実際には aまたは anを返すかどうかはわかりませんOtherHero

今、あなたは書くことができます:

Quad foo = method();

さて、実際には の正確なタイプはわかりませんが、fooとして使用できますQuad

人気のある例はjava.util.List

あなたは書ける:

List<Integer> list = Arrays.asList(1,2,3,4,5,6);
Collections.shuffle(list);

ListArrayListLinkedListおよび他の多くのクラスによって実装されるインターフェイスです。コードを知らなければ、どのクラスが によって正確に返されるのかわかりませんがArrays.asList()、それを として使用することはできますList

于 2013-04-28T21:15:32.337 に答える
2

オブジェクトをQuadthen の変数に格納すると、コンパイラが認識している限り、その変数に格納されているオブジェクトは であり、それ以上のものではQuadありません。確かにサブタイプの可能性がありますが、コンパイラはそのサブタイプが何であるかを知りません。それが知っている限りでは、そのサブタイプは基本タイプにまったくゼロのメンバーを導入します。コンパイラが、オブジェクトQuadQuad.

確かに、この変数には式が割り当てられているだけであることがわかりますnew Hero()。そして、確かに、特定の変数がそのHero型のオブジェクトのみを保持することを知っているかもしれません。しかし、これは実際に推測できる実行時の情報です。コンパイラは、これらすべてのシナリオをわざわざ計算することはできません。それがあなたを持っている理由です。その変数に格納されているオブジェクトが常に typeであることがわかっている場合は、続けHeroてコンパイラに表現できます。

Hero言語でオブジェクトをスーパー タイプにキャストできる理由の 1 つは、多くの場合、そのオブジェクトを、基本クラスのすべての可能なサブタイプ (たとえば、 )を知る必要がないメソッドに渡したいからです。渡されたオブジェクトが少なくとも基本クラス (たとえば、Quad) であること。もう 1 つの典型的なシナリオは、すべてが同じ特定の型ではない (それらは all ではないHero) さまざまなオブジェクトを格納したいが、それらはすべて共通の祖先 (それらは all であるQuad) を持ち、それらをまとめて何かをしたい場合です。一般に、オブジェクトを祖先クラスにキャストすることは許可されています。これは、基本型が必要な状況でオブジェクトをその基本型と互換性を持たせるのに役立つためです

于 2013-04-28T21:23:45.213 に答える