1

質問は非常に基本的なものかもしれません。私はJavaを初めて使用するので、ご容赦ください。私のコード:

class A
{
     int b=10;

     A()
     {
          this.b=7;
     }

     int f()
     {
          return b;
     }
}

class B extends A{ int b; }

class Test
{
     public static void main(String[] args)
     {
          A a=new B();
           System.out.println(a.f());
     }
}

なぜ出力7なのですか?クラスBは独自のインスタンス変数を取得しませんbか?

4

2 に答える 2

6

そうですが、関数はにfあるバージョンしか見ることができません。したがって、関数は7を返します。bA

関数をにコピーすると、返されるメンバーが表示fされます。class Bbclass B

クラスのインスタンス変数を非表示にすることで説明されているように、Java変数はポリモーフィックではありません。2つのb変数は、予想どおり2つの異なる変数ですが、関数を呼び出すと、を持っている1つの変数A.fしか見ることができません。したがって、戻りますが、戻りません。bAA.bB.b

したがって、質問に答えるために、クラスBは独自のインスタンス変数bを取得します。これは完全に独立してA.bいますが、現在アクセスする方法がないため、その値を確認できません。

于 2013-01-08T00:11:18.550 に答える
0

タイプ参照はA次のとおりです。

A a = new B(); 

したがって、インスタンスフィールド/静的フィールドと静的メソッドは、関係するメソッド(あなたの場合)がによってオーバーライドされないA限り、から提供されます。f()B

他の言語では、Scalaのように、変数をサブクラスで再定義し、スーパータイプ参照からでもターゲットにすることができます。

于 2013-01-08T00:17:34.123 に答える