Что происходит, когда объект подкласса назначается как объект суперкласса - PullRequest
1 голос
/ 31 марта 2019

Итак, у меня есть вопрос о суперклассе A и подклассе B, где A имеет 2 открытые переменные, а B имеет еще 1.

Я видел этот фрагмент кода:

A a = new A();
B b = new B();
a = b; 

Что делает эта последняя строка? Я не очень понимаю, что на самом деле происходит, когда вы используете "=" между двумя классами в отношениях наследования.

Ответы [ 2 ]

0 голосов
/ 31 марта 2019

Это простое задание.= является оператором присваивания.

Позволяет очистить нижеследующие пункты.

  1. В Java, когда объект создан и доступен через.ссылка.Ссылка ссылается на объект.
  2. В то время, когда одна ссылка может ссылаться только на один объект
  3. Ссылка типа X может ссылаться на объект типа X или любые подтипы (расширение в случае, если X является классом или реализующимесли X - интерфейс).

Теперь предположим, что есть два класса Super и Sub, таких что Sub extends Super.

 SuperClass reference = new SubClass();  

Это разрешено, поскольку подкласс наследует от суперкласса.Выше у нас есть объект типа SubClass, созданный в куче, и он доступен через.ссылка с именем reference

Обратите внимание, что ссылка типа SubClass не может ссылаться на объект SuperClass.Посмотрим вкратце, почему так?Если бы ссылка типа SubClass позволяла ссылаться на Объект типа SuperClass, тогда было бы разрешено вызывать дополнительные методы (функции), определенные SubClass (SubClass наследовало бы все методы SuperClassи также определил бы несколько дополнительных методов).Теперь это привело бы к сбою приложения, поскольку объект SuperClass имеет только методы, определенные в SuperClass, но не имеет никаких дополнительных методов, определенных SubClass.Следовательно, компилятор предотвращает это во время компиляции.Это ошибка времени компиляции, чтобы иметь ссылку типа SubClass, ссылающуюся на объект типа SuperClass

Теперь давайте посмотрим на код, упомянутый в вопросе

 SuperClass a = new SuperClass();
 SubClass b = new SubClass();
 a = b; 

Строка1: У нас есть объект SuperClass, на который ссылается переменная типа SuperClass с именем a

Строка 2: У нас есть объект SubClass, на который ссылается переменная типа SubClass с именем b

Строка 3: у нас есть назначение, где a назначено для ссылки на тот же объект, на который ссылается b.Итак, теперь у нас есть обе ссылки, ссылающиеся на объект типа SubClass, созданный в строке 2. Объект typer SuperClass, созданный в строке 1 (с текущим доступным кодом, упомянутым в вопросе), не имеет каких-либо ссылок, поэтому он приемлемдля сбора мусора.

0 голосов
/ 31 марта 2019

Ничего не происходит. Объект, на который ссылается переменная 'b', является отдельным объектом. Это одновременно экземпляр B и экземпляр A.

Когда вы выполняете присваивание a = b, объект, на который ранее ссылалась переменная 'a', становится недоступным. Рассмотрение этого старого объекта не входит в это обсуждение.

После присваивания «a» и «b» относятся к одному и тому же объекту. Объект неизменен. Это все еще экземпляр B и экземпляр A.

Возможно, блок в вашем понимании - это различие между объектами и переменными, которые ссылаются на эти объекты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...