2015-06-30 9 views
6

Привет У меня есть вопрос о наследовании. В Java объект подкласса имеет внутри него объект своего суперкласса?Распределение памяти JVM

Когда JVM выделяет пространство для объекта подкласса, выделяет пространство для поля/метода суперкласса? Благодарю.

Пример:

class Bar { 
    public String field; 

    public Bar() { 
     this.field = "Bar"; 
    } 
} 

class Foo extends Bar { 
    public String field; 

    public Foo() { 
     this.field = "Foo"; 
    } 

    public void printFields() { 
     System.out.println("Base: " + super.field); 
     System.out.println("This: " + this.field); 
    } 
} 

В исполнении, напечатает "Бар" и "Foo". Где Java выделяет пространство для mantain оба значения для «поля»?

ответ

1

Да, Java будет выделять пространство для двух ссылок на объекты - один для Foo.field, а другой для Bar.field. Грубо говоря, это может быть способ визуализировать экземпляр Foo в памяти:

[header] (references Foo.class, Bar.class, Object.class, among other details) 
[Section for Bar]: 
    Field, declared type String, referencing a `java.lang.String` with value "Bar" 
[Section for Foo]: 
    Field, declared type String, referencing a `java.lang.String` with value "Foo" 

Смещения этих полей известны JVM и используются при чтении/записи их.

Обратите внимание, что это не означает, Foo содержит Bar, а Foo является Bar и многое другое.

+0

Спасибо :) Я пытаюсь дать вам «+» голос, но я не могу .... – JCoder

+0

Как вы показываете эту информацию о памяти? :) – JCoder

+1

@JCoder Эта информация не отображается, но это то, что я написал, чтобы проиллюстрировать концепцию. – hexafraction

1

В Java объект подкласса имеет внутри него объект своего суперкласса.

№ Подкласс не «содержит» его родительский объект. Наследование - это отношение «is-a». Экземпляр Foo является экземпляром Bar. Не тот Foo содержит Bar.

Когда JVM выделяет пространство для объекта подкласса, выделяет пространство для поля/метода суперкласса?

Да. Хотя подкласс Foo имеет поле с тем же именем (следовательно, «затенение» родительского поля), в памяти еще есть два поля.

+0

Спасибо :) То же самое для вас. Я пытаюсь дать вам «+» голос, но я не могу – JCoder

+1

частные поля и методы на суперклассе наследуются, они просто недоступны. Память выделяется, может ли дочерний класс обращаться к ним или нет. – codelark

+0

@codelark Вы правы! Благодарю. Тем не менее, строго говоря, поля 'private' выделены, но не _inherited_. – manouti

Смежные вопросы