3

次のシナリオでは:

class Person{
    public int ID;  
}

class Student extends Person{
    public int ID;
}

Student"は人のIDフィールドを非表示にします。

メモリ内で次のことを表現したい場合:

Student john = new Student();

johnオブジェクトには、storint Person.IDとそれ自体の2つの個別のメモリ位置がありますか?

4

3 に答える 3

5

はい、次のように確認できます。

class Student extends Person{
    public int ID;

    void foo() {
        super.ID = 1;
        ID = 2;
        System.out.println(super.ID);
        System.out.println(ID);
    }
}
于 2012-04-14T14:36:17.743 に答える
5

正しい。例のすべてのクラスには、独自のint IDidフィールドがあります。

この方法で、サブクラスから値を読み取ったり割り当てたりできます。

super.ID = ... ; // when it is the direct sub class
((Person) this).ID = ... ; // when the class hierarchy is not one level only

または外部(公開されている場合):

Student s = new Student();
s.ID = ... ; // to access the ID of Student
((Person) s).ID = ... ; to access the ID of Person
于 2012-04-14T14:46:54.643 に答える
1

はい、その通りです。2つの異なるintがあります。

Person次のコマンドで'sintinにアクセスできますStudent

super.ID;

ただし、メンバーフィールドでは動的ディスパッチは発生しないことに注意してください。フィールドを使用するPersonでメソッドを定義すると、オブジェクトで呼び出された場合でも、フィールドではなく、フィールドIDを参照します。PersonStudentStudent

public class A
{
    public int ID = 42;

    public void inheritedMethod()
    {
        System.out.println(ID);
    }
}

public class B extends A
{
    public int ID;

    public static void main(String[] args)
    {
        B b = new B();
        b.ID = 1;
        b.inheritedMethod();
    }
}

上記は1ではなく42を出力します。

于 2012-04-14T14:33:56.033 に答える