0
public class A 
{
    public static int i;
}
public class B extends A
{
    public static void main(String[] args)
    {
        System.out.println("print i=" + B.i); // referred to A.i
    }
}

ここでの私の質問は、? をどのようB.iに参照するA.iかです。

静的変数iが継承されている場合、なぜJavaはiBクラスでも別の変数を定義できるのですか?

4

4 に答える 4

1

私はここに静的変数です.静的変数は、素人の用語では、すべてのクラスによってアクセスされる単一のコピーを意味します.したがって、クラスBがAを拡張するため、BはAの静的変数にアクセスできます.

変数をローカルで定義すると、変数のローカル値によって親クラスの値が隠されます。

于 2013-04-10T10:04:11.627 に答える
1

の public または protected メンバーはA、 のすべてのサブクラスで可視ですA

静的変数 i が継承されている場合、Java が B クラスでも別の変数 i を定義できるのはなぜですか?

その理由を推測するのは困難です。考えられる理由の 1 つは、これにより、たまたま同じ名前のメンバーを持つ派生クラスを壊すことなく、基底クラスにメンバーを追加できることです。

iで別のものを定義するBと、 がシャドウ A.iされ、後者へのアクセスが困難になることに注意してください。これがポリモーフィックに動作することを期待している人々を見てきましたが、そうではありません(とにかく、あなたのケースはわずかに異なりますA.i) static

于 2013-04-10T09:44:53.980 に答える
0

スコープと可視性の 2 つの異なるものがあります。同じスコープで変数を 2 回再定義することはできません (ただし、ネストされたスコープで変数を再定義することはできます)。

ただし、継承の場合、サブクラスはスーパークラスの範囲外ですが、継承のためにその変数への可視性があります。したがって、サブクラスを使用するとi、スーパークラスの変数が非表示になりますが、変数を再度定義できます。あなたはその価値を見ることができません。(スーパークラスのゲッターを使用しない場合)

于 2013-04-10T09:46:04.510 に答える
0

Java では、拡張クラスの特定の変数値を変更できます。

これは、静的変数が同じクラスのすべてのオブジェクト間で共有されるためです。 オブジェクト(インスタンス)ではなく、クラスに属する変数です。

したがって、親クラスの静的変数を拡張する場合、実際には拡張クラスの一部ではありませんが、アクセス可能です (それらがプライベートでない限り)。

さらに、これは次のようなことを行うために使用できます。

  • 拡張クラスには異なる STATIC CONSTANT を使用します。

これの用途は、instanceof を利用するのではなく、STATIC 整数に基づいてクラスを識別することです。これをさらにスイッチと組み合わせて、オブジェクトの種類に基づいて動作を変更できます。

したがって、最も基本的な例では、TYPE を表す変数を作成するとします。

class A
{
    public static final int NODE_TYPE = NODE_PERSON;
    public static final int NODE_PERSON = 0;
    public static final int NODE_CAR = 1;

}

class B extends Class A
{
    public static int NODE_TYPE = NODE_CAR;
}

これは、Eclipse 抽象構文ツリーを含む多くのフレームワークで使用されています。

http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom%2FASTNode.html

さまざまなノード タイプを表す STATIC INTEGERS のリストが表示されます。

于 2013-04-10T09:46:34.793 に答える