Если я изменю переменную экземпляра родительского класса, изменения отразятся в дочернем классе, даже если они имеют разные identityHashCodes. Почему это происходит?
Я попытался создать собственные переменные экземпляра ребенка, которые затем не отражают изменения из-за вызовов ссылочного типа. Кроме того, я сначала вызвал дочерний метод, который печатает переменные экземпляра, затем вызвал родительский метод, который вносит некоторые изменения, а затем печатает. это доказывает, что изменения выполняются динамически, а не во время компиляции. Я пробовал использовать оба конструктора, которые не сильно повлияли на мою проблему.
class Library{
int count = 500;
int years = 70;
Library(){
System.out.println(" Constructor library ");
}
Library(int count,int years){
this.count = count;
this.years = years;
System.out.println(" Constructor library ");
}
void libraryInfo(){
count++;
System.out.println(System.identityHashCode(count));
System.out.println(" Years " + years);
System.out.println(" Count " + count);
}
}
class Book extends Library{
//int count = 500;
//int years = 70;
Book(){
super(700,80);
// super();
}
void libraryInfo(){
super.libraryInfo();
System.out.println(System.identityHashCode(count));
System.out.println(" Years " + years);
System.out.println(" Count " + count);
//super.libraryInfo();
}
public static void main(String args[]){
Book b = new Book();
b.libraryInfo();
}
}
Ожидаемые результаты: изменения ограничены только родительским классом. Фактические результаты показывают, что изменения также отражаются на дочернем объекте.
Нет «родительского объекта» и «дочернего объекта». Есть просто "объект".
Класс — это (более или менее) просто схема для создания объекта. При наследовании часть схемы записывается в родительском объекте, а часть — в дочернем.
В вашем случае ваш объект - Книга. У Книги есть некоторые характеристики, которые она унаследовала от Библиотеки, но это все еще Книга. Нет Книги и Библиотеки как отдельных объектов. (Это довольно странная модель наследования: библиотеки имеют очень мало общего с книгами.)
Я думаю, что ваша основная путаница заключается в понимании System.identityHashCode, как говорится в комментарии:
Returns the same hash code for the given object as
would be returned by the default method hashCode(),
whether or not the given object's class overrides
hashCode().
Если вы измените параметр count на этот, они вернут то же значение. Вы можете определить количество в классе Book, чтобы переопределить родителя, если хотите, чтобы они были разделены.
Я попытаюсь объяснить это более просто на странном примере, но это может помочь понять концепцию.
Скажем, отец купил велосипед для своего сына, тогда его сын может сказать, что это его велосипед (поскольку он унаследовал его от отца), и он может ездить на нем, когда захочет.
Теперь скажем, что в мотоцикле остался 1 литр бензина, а отец заправил полный бак, тогда, когда его сын в следующий раз увидит мотоцикл, он тоже будет полон.
Я надеюсь, что это поможет понять.
@ 0ne0rZer0 System.identityHashCode(Object x)
Этот метод ожидает объект в качестве параметра. Вы передаете ему переменную int
, то есть int count
. Попробуйте это с классом-оболочкой Integer
. Это может быть связано с автоматической упаковкой int в Integer.
Я попробовал это с переменной экземпляра строки, не могли бы вы сказать мне, как мне использовать класс-оболочку, чтобы сделать то же самое?
@ 0ne0rZer0 Каждому примитивному типу данных соответствует один класс-оболочка. Например, вместо int
я сказал Integer
. Не было необходимости использовать String
, вы могли бы добиться того же и с помощью Integer
. Вы можете прочитать больше о классах-оболочках здесь
Я понимаю, но разве велосипед не одинаков для них обоих? Здесь подсчет дает нам разные идентификаторыHashCodes, что может означать, что это разные объекты.