سؤال

In the following scenario:

class Person{
    public int ID;  
}

class Student extends Person{
    public int ID;
}

Student "hides ID field of person.

if we wanted to represent the following in the memory:

Student john = new Student();

would john object have two SEPARATE memory locations for storint Person.ID and its own?

هل كانت مفيدة؟

المحلول

Correct. Every class in your example has its own int ID id field.

You can read or assign values in this way from the sub classes:

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

Or externally (when they are public):

Student s = new Student();
s.ID = ... ; // to access the ID of Student
((Person) s).ID = ... ; to access the ID of Person

نصائح أخرى

Yes, as you can verify with:

class Student extends Person{
    public int ID;

    void foo() {
        super.ID = 1;
        ID = 2;
        System.out.println(super.ID);
        System.out.println(ID);
    }
}

Yes, that is correct. There will be two distinct ints.

You can access Person's int in Student with:

super.ID;

Be careful though, dynamic dispatch doesn't happen for member fields. If you define a method on Person that uses the ID field, it will refer to Person's field, not Student's one even if called on a Student object.

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();
    }
}

The above will print 42, not 1.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top