Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

初歩的な質問ですみません

最近まで Ruby を扱っていたのですが、java の初歩で詰まってしまいました。
ご存知の方がいらっしゃいましたらご教授願います。


1.p2 は Parentクラスのインスタンスと宣言しているのに、なぜ Chilldクラスで初期化できるのでしょうか。

2.p2.GetType() が実行されると p2 は Childクラス と表示されるので、p2.Display() が実行されると ChildクラスのDisplayメソッドを呼び出すこと、p2.hoge() が継承関係から実行可能なことは了解しました。
しかし、p2.ci と Childクラスのインスタンス変数を参照できない事が疑問です。


class Parent
{
    int pi = 10;

    void hoge()
    {
        System.out.println("class Parent is called.");
    }
    
    void Display()
    {
        System.out.println("class Parent is called.");
    }
}

class Child extends Parent
{
    int ci = 100;

    void Display()
    {
        System.out.println("class Child is called.");
    }
}

class Program
{
    public static void main(String[] args)
    {
        Parent p1 = new Parent();
        Parent p2 = new Child();

        p1.Display();
        p2.Display();
        p2.hoge();

        System.out.println(p1.GetType());
        System.out.println(p2.GetType());

        System.out.println(p2.pi);
        //System.out.println(p2.ci); // コンパイルエラー
    }
}

4

回答

4280

閲覧

4件の回答

評価

0

>p2 は Parentクラスのインスタンスと宣言
インスタンスとして宣言なんてないよ。
この「参照」は「Parentとして扱います」っていうだけだ。
実体がParentでもChildでも関係ない。

それが納得できれば、2も納得できると思うんだが。

評価

0

>>p2 は Parentクラスのインスタンスと宣言
>インスタンスとして宣言なんてないよ。
>この「参照」は「Parentとして扱います」っていうだけだ。

間違いのご指摘ありがとうございます。

しかしながら、以下のように Parentクラスを改変した場合、 p2.Display() でコンパイルエラーになる理由がよくわかりません。

追加した c は p2 を Childクラスでキャストしたもので初期化するとコンパイルエラーも起こらず、 Childクラスの性質を持っているように見受けられます。
ということは p2 の実態は Childクラスとなるのでしょうか?
それともご指摘の通り、「実体がParentでもChildでも関係ない。」ということを理解すると納得できるのでしょうか?

重ね重ねすみません。


class Parent
{
    int pi = 10;
}

class Child extends Parent
{
    int ci = 100;

    void Display()
    {
        System.out.println("class Child is called.");
    }
}

class Program
{
    public static void main(String[] args)
    {
        Parent p2 = new Child();
        Child c = (Child)p2;

        //p2.Display(); // コンパイルエラー
        c.Display();

        System.out.println(p2.GetType());
        System.out.println(c.GetType());

        System.out.println(p2.pi);
        //System.out.println(p2.ci); // コンパイルエラー
        System.out.println(c.pi);
        System.out.println(c.ci);
    }
}

評価

0

>p2 の実態は Childクラスとなるのでしょうか?

より具体的に言うと「p2が参照している実体は」かな。

>以下のように Parentクラスを改変した場合、 p2.Display() でコンパイルエラーになる理由がよくわかりません。

改変すると、Displayメソッドは、
Parentクラスから消滅してるでしょ。

評価

0

>より具体的に言うと「p2が参照している実体は」かな。

>改変すると、Displayメソッドは、
>Parentクラスから消滅してるでしょ。

この2つの意味がやっとリンクしました。
ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。