1
class One
{
    void show1()
    {
       System.out.println("super class");
    }

}

class Two extends One
{
    static void show2()
    {
       System.out.println("subclass");
    }


}
public class Cast 
{
    public static void main(String[] args)

    {
      One o=(One) new Two();
      o.show1();

    }

}

このステートメントは、このコードでどのように機能しますOne o=(One) new Two();か? なぜ私はこのように使えないの Two o=(One) new Two();ですか?o ここではスーパークラス変数ですが、キャストの使用について混乱しています.. oを使用してサブクラスメソッドを参照できないのはなぜですか?

4

4 に答える 4

3

このステートメントがこのコードでどのように機能するかOne o=(One) new Two();

これは、クラスのオブジェクトTwoが作成され、クラスの参照によってポイントされることを意味しますOne。型キャストは必要ありません。

なぜこのように使えないの? Two o=(One) new Two();

それがポリモーフィズムです。派生クラスは基本クラスを指すことはできません。

経験則:基本クラスは、任意の派生クラスを指すことができます。(その逆ではありません)。したがって、派生クラスを基本クラスにキャストできますが、その逆はできません。

ただし、ここはスーパークラス変数です。o を使用してサブクラス メソッドを参照できないのはなぜですか。

ただし、実際のオブジェクトは派生クラスであり、参照は基本クラスです。派生クラスでオーバーライドされる派生クラスのメソッドのみにアクセスできます。

次のコード行を試して、自分自身を確認してください。

Two obj = new One(); // Error
One obj = new Two(); // OK
Two obj = (Two) new One(); // Error

これを参照してください: ClassCastExceptionClassCastException、およびJavaの「ClassCastException」の説明

于 2013-02-06T06:44:14.470 に答える
2

右側の変数は、左側の変数と同じタイプ (または任意のサブタイプ) である必要があります。

One o=(One) new Two();

Twoこれは のサブタイプであるOneため、 にキャストOneでき、 type の参照変数とともに使用できますOne

 Two o=(One) new Two();

ここでは、アップキャストTwoされている型のオブジェクトをキャストできますが、同じキャストされたオブジェクトをのサブクラスではないためOne、型の参照変数に割り当てることはできません。TwoOneTwo

与えられた階層は

One      
 |--> Two   

Two階層内の One (One のサブタイプ) の下にある代わりに使用できますOneが、その逆はできません。

于 2013-02-06T06:46:59.210 に答える
1

このステートメントの仕組み

One o=(One) new Two();

タイプのオブジェクトがTwoヒープ上に作成されます。ただし、参照oは型への参照になるようにキャストされますOne

実際には次のことができます。

Two o = new Two();
o.show1();

メソッドTwoもあるからです。show1

なぜこのように使えないの? Two o=(One) new Two();

参照の不一致。しかし、あなたはこれを行うことができます

Two o=(Two)(One) new Two();
于 2013-02-06T06:45:45.597 に答える
1

o を使用してサブクラス メソッドを参照できないのはなぜですか。

ここでshow2メソッドはサブクラスにのみ存在し、スーパークラスには存在せず、オブジェクト o は派生クラスですが、派生クラスでメソッドをオーバーライドする必要があるため、show2 にアクセスできません。

于 2013-02-06T06:53:58.947 に答える