次のシナリオでは:
class Person{
public int ID;
}
class Student extends Person{
public int ID;
}
Student"は人のIDフィールドを非表示にします。
メモリ内で次のことを表現したい場合:
Student john = new Student();
johnオブジェクトには、storint Person.IDとそれ自体の2つの個別のメモリ位置がありますか?
次のシナリオでは:
class Person{
public int ID;
}
class Student extends Person{
public int ID;
}
Student"は人のIDフィールドを非表示にします。
メモリ内で次のことを表現したい場合:
Student john = new Student();
johnオブジェクトには、storint Person.IDとそれ自体の2つの個別のメモリ位置がありますか?
はい、次のように確認できます。
class Student extends Person{
public int ID;
void foo() {
super.ID = 1;
ID = 2;
System.out.println(super.ID);
System.out.println(ID);
}
}
正しい。例のすべてのクラスには、独自のint ID
idフィールドがあります。
この方法で、サブクラスから値を読み取ったり割り当てたりできます。
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
はい、その通りです。2つの異なるintがあります。
Person
次のコマンドで'sintinにアクセスできますStudent
。
super.ID;
ただし、メンバーフィールドでは動的ディスパッチは発生しないことに注意してください。フィールドを使用するPersonでメソッドを定義すると、オブジェクトで呼び出された場合でも、フィールドではなく、フィールドID
を参照します。Person
Student
Student
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を出力します。