Почему изменения переменных экземпляра родительского класса отражаются в дочернем классе?

Если я изменю переменную экземпляра родительского класса, изменения отразятся в дочернем классе, даже если они имеют разные 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();
        }

}

Ожидаемые результаты: изменения ограничены только родительским классом. Фактические результаты показывают, что изменения также отражаются на дочернем объекте.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
129
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Нет «родительского объекта» и «дочернего объекта». Есть просто "объект".

Класс — это (более или менее) просто схема для создания объекта. При наследовании часть схемы записывается в родительском объекте, а часть — в дочернем.

В вашем случае ваш объект - Книга. У Книги есть некоторые характеристики, которые она унаследовала от Библиотеки, но это все еще Книга. Нет Книги и Библиотеки как отдельных объектов. (Это довольно странная модель наследования: библиотеки имеют очень мало общего с книгами.)

Я думаю, что ваша основная путаница заключается в понимании 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 литр бензина, а отец заправил полный бак, тогда, когда его сын в следующий раз увидит мотоцикл, он тоже будет полон.

Я надеюсь, что это поможет понять.

Я понимаю, но разве велосипед не одинаков для них обоих? Здесь подсчет дает нам разные идентификаторыHashCodes, что может означать, что это разные объекты.

0ne0rZer0 19.07.2019 08:47

@ 0ne0rZer0 System.identityHashCode(Object x) Этот метод ожидает объект в качестве параметра. Вы передаете ему переменную int, то есть int count. Попробуйте это с классом-оболочкой Integer. Это может быть связано с автоматической упаковкой int в Integer.

gprathour 19.07.2019 09:03

Я попробовал это с переменной экземпляра строки, не могли бы вы сказать мне, как мне использовать класс-оболочку, чтобы сделать то же самое?

0ne0rZer0 19.07.2019 09:58

@ 0ne0rZer0 Каждому примитивному типу данных соответствует один класс-оболочка. Например, вместо int я сказал Integer. Не было необходимости использовать String, вы могли бы добиться того же и с помощью Integer. Вы можете прочитать больше о классах-оболочках здесь

gprathour 19.07.2019 10:47

Другие вопросы по теме