1

私のコードは:-

class Building{}

class Barn extends Building{
    public static void main(String[]args){
        Building build1 = new Building();
        Barn bar1 = new Barn();
        Barn bar2 = (Barn)build1;
        Object obj1 = (Object)build1;
        String str1 = (String)build1;    //also an error over here
        Building build2 = (Building)bar1;
    }
}

私はJavaが初めてです。各オブジェクトへのアクセス権がどのように付与されているかなど、ここでインスタンス化がどのように実行されているかを誰かに説明してください。

また、コードにエラーがありますので、それも修正してください。

4

3 に答える 3

1

これを考えるとBarn bar2 = (Barn)build1;

equal ((Barn)build1)の後の部分は、 Build1 をBuilding型からBarn型に型キャスト、その値を bar2 に渡すことを 意味します。

クラス定義で拡張した(Barn extends Building)ように、任意の納屋建物であるため、これを行うことができます。Java では、すべてのクラスが Object から拡張されているため、任意のクラス型を Object クラスに型キャストすることもできます。つまり、すべてが Object です。

Building には String クラスとの接続がないため、String としてキャストしようとするとエラーが発生します。とった?

于 2012-08-09T14:57:20.430 に答える
1

Buildingの型としてキャストすることはできませんString。2 つのクラス (継承、インターフェイスなど) の間に関係はありません。

Buildingaが であることは確かですが、オブジェクトを にキャストすると、オブジェクトObjectに関する情報が失われます。BuildingObject

変数のインスタンス化は右から左への結合です。各オブジェクトの新しいインスタンスを作成し、それを変数に割り当てます。キャストを行っている場合は、キャスト先の型が取得している型に関連していることを確認することが重要です (つまり、 an を anObjectとしてキャストするInteger- 返されるかどうかに応じて、動作する場合と動作しない場合があります) )として合理的にキャストできますInteger

于 2012-08-09T14:49:46.083 に答える
0
  Building b = (Building) (new Barn());

追加された Barn フィールドを無視して、Building のすべてのメンバーとフィールドにアクセスできます (ダウンキャストと呼ばれます)。

  Barn b = (Barn) (new Building());

納屋固有のメンバーにアクセスするときにヌルポインターが発生するか、初期化されていないままになります... Cat を期待していない限り、 Animal を Cat にキャストすることはほとんど意味がないため、アップキャストするとどうなるか忘れてしまいました。 )

特定のメソッドやデバッガーがなければ、違いに気付くことはできません。あなたのコードにはユースケースが見られず、キャストのみです。

于 2012-08-09T15:05:36.330 に答える