Java field hiding

2019-02-19 06:12发布

问题:

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?

回答1:

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


回答2:

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


回答3:

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.