0

私はJavaが初めてで、キャストに問題があります。Parent というクラスと Children というクラスがあり、Children クラスは Parent のサブクラスです。

public class Parent
{
    int age;
    String occupation;

    public void print()
    {
        System.out.println("My age is:"+ age + "and i am a:" + occupation);
    }
}



public class Children extends Parent
{
    int height;

    public static void main(String args[])
    {
        Children c = new Children();
        Parent p = new Parent();

        p=c;
        c=(Children) p;

        /**Here***/



    }

}

私の問題は、キャスト後に p.XXX を追加すると、インスタンス p にアクセスできる年齢と職業しか表示されないことです。c.xxx を実行すると、すべての年齢、職業、身長にアクセスできることがわかります。p=c を実行すると、p は子クラスのインスタンスと見なされるようになりましたね。はいの場合、高さの整数にアクセスできないのはなぜですか? そして、c=(Children)p を実行すると、Parent クラスのインスタンスが Children クラスのインスタンスに割り当てられます。Parent インスタンスにはオプションがないため、親から子へのキャストを行う理由は正しいですか?

4

1 に答える 1

7

p=c を実行すると、p は子クラスのインスタンスと見なされるようになりましたね。

いいえ。変数のpはまだParentです。はのインスタンスへの参照になりますChildrenが、コンパイラはそれを考慮しません。変数の宣言された型のみを使用します。

そして、私が行うc=(Children)pと、クラスのインスタンスがクラスParentのインスタンスに割り当てられます。インスタンスにはオプションがないため、親から子へのキャストを行う理由は正しいですか?ChildrenParent

インスタンスをまったく変更していません。タイプの式をキャストしていますParent- 値は参照になります。実行時に、JVM は、値が実際に のインスタンスChildrenまたは何らかのサブタイプ (または null) への参照であることを確認します。そうでない場合、JVM は例外をスローします。

変数、参照、およびオブジェクトを区別することは非常に重要です。これらは 3 つのまったく異なる概念であり、それらの違いを確実に理解することで、他の多くのことがより明確になります。

于 2012-06-13T18:54:37.430 に答える