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

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

0

変数のオーバーライドについて

基本情報技術者試験で、javaの勉強をしています。
class TestA {
    int n=10;
    int getN() {
        return n;
    }
    void disp() {
        System.out.println("クラスTestA:"+n);
    }
}
class TestB extends TestA {
    int n=20;
    
    void disp() {
        System.out.println("クラスTestB:"+n);
    }
}
class Test808 {
    public static void main(String[] args) {
        TestB objB=new TestB();
        System.out.println("objB.n:"+objB.n);
        System.out.println("objB.getN():"+objB.getN());
        objB.disp();
        
        TestA objA=objB;
        System.out.println("objA.n:"+objA.n);
        System.out.println("objA.getN():"+objA.getN());
        objA.disp();
    }
}
実行結果で、
objB.n:20
objB.getN():10
クラス TestB:20
objA.n:10
objA.getN():10
クラス TestB:20
となりましたが、結果の4行目の
objA.nが20になると思いましたが、10となってます。
objAにはobjBのアドレスが入っているので、同じものではないでしょうか?

4

回答

36008

閲覧

4件の回答

評価

0

メソッドはオーバーライドされるけど、
変数はオーバーライドされないということでしょうか。

評価

30

・オーバーライドとは「振る舞いを変えること」であって、Javaではメソッドの上書きのことを言う。
・10が出力される理由は、「objAがTestAのインスタンスと見なされる」から。
・disp()で20が出力される理由は、「TestBでdisp()の振る舞いを変えている」から。
TestB.disp()に書かれたnは、TestBにあるのだからTestBのnになる。

TestAのnは、メソッド(処理)と違ってTestBから中身を変えられるのだから、そもそもTestBに置く必要がない。
class TestB extends TestA {
     TestB() {
        n=20;
     }
     void disp() {
(略)
とすれば、TestAのnが20になる。

評価

0

ついでに言うと
        System.out.println("クラス"+getClass().getSimpleName()+":"+n);
とすれば、disp()の振る舞いも変えないで済む。

評価

0

匿名さん、ありがとうございました。
オーバーライドとは、メソッドの上書きと覚えればいいですね。
わからないことだらけですが、またよろしくお願いいたします。

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