12

私はいくつかのコードに出くわしました、そして私はいくつかの広範な検索をしましたが、それの特定の側面を理解することができません!

私の質問は、次のコードのように、クラスが括弧内で宣言されることがあるのはなぜですか?

public class Animal {

    public static void hide() {
        System.out.println("The hide method in Animal.");
    }

    public void override() {
        System.out.println("The override method in Animal.");
    }
}

public class Cat extends Animal {

    public static void hide() {
        System.out.println("The hide method in Cat.");
    }

    public void override() {
        System.out.println("The override method in Cat.");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = (Animal)myCat;
        myAnimal.hide();
        myAnimal.override();
    }
}

特にこのコード行に焦点を当てています。

            Animal myAnimal = (Animal)myCat;

あるクラスが別のクラスを拡張するという事実と関係があると思いますが、括弧内に定義されたクラスが何を意味するのかわかりません。

これに関するどんな助けもありがたいです。前もって感謝します。

4

4 に答える 4

12

あなたが見ているのは、猫を動物に割り当てても大丈夫だとコンパイラに伝えるためのキャストです。

キャストは、コンパイラが関係する型が何であるかを知らないため、または変換によって情報が失われるため(たとえば、必要なdoubleがある場合)、コンパイラが1つの型を別の型に安全に変換できない場合に使用します。タイプfloatの変数に格納します)。

あなたの例では、猫は動物を拡張するので、キャストは完全に不要です。すべての猫は動物であるため、コンパイラは、猫を動物に割り当てることができることを示すために明示的なキャストを必要としません。

キャスティングは特別な機会のために予約する必要があります。明示的なキャストを定期的に使用する場合は、型システムから最大のメリットが得られない可能性があります。

于 2012-07-30T19:42:41.203 に答える
7

これはキャストです-myCatタイプの変数Catは基本クラスにキャストされていAnimalます。

これは、と見なすことができることを意味しますAnimal

これは、Javaの継承の基本的な機能です。


@Sebastian Koppehel がコメントしたように、この場合のキャストは必要ありません- myAnimal(タイプの)変数はAnimal、を実装する任意のタイプを受け入れることができますAnimal

于 2012-07-30T19:38:28.153 に答える
1

コードが正しい出力を生成する場合でも、オブジェクトを親クラスにキャストしてから親クラスの静的メソッドを呼び出す必要がある場合は、クラスをより適切に設計する必要があります。Javaでの継承は、一般的なメソッドとフィールドへのアクセスを提供することになっています。親クラスで静的メソッドをコーディングし、子クラスのオブジェクトを使用して呼び出す必要がある場合、親クラスと子クラスの関係は明確ではありません。

于 2012-07-30T20:04:13.023 に答える
0

渡すcat参照型がAnimalの型であることをコンパイラー/ランタイムに明示的に保証します。Javaでは、キャストと呼ばれます。

この契約が守られていない場合(つまり、猫と動物の間に関係が定義されていない場合)、実行時にが取得されますClassCastException

于 2012-07-30T19:41:35.843 に答える