Объект в программировании - это экземпляр класса, которому можно назначить определенное поведение и состояние. Класс, в свою очередь, это пользовательский тип данных, который определяет характеристики (атрибуты или свойства) и поведение (методы) своих объектов. Попробуем разбить это на простые элементы. - **Состояние (State)** - это коллекция атрибутов в данное время. Например, у вас есть объект автомобиля. Состояние этого автомобиля может включать такие атрибуты, как цвет, марка, модель, скорость, направление и т.д. - **Поведение (Behavior)** - это функционал объекта, функции, которые можно произвести над объектом. В нашем примере с автомобилем, поведение может включать такие функции, как запуск двигателя, остановка двигателя, изменение скорости, поворот и т.д. - **Идентичность (Identity)** - это свойство объекта, которое отличает его от других. В случае с автомобилем это может быть номерной знак или VIN-номер. В объектно-ориентированном программировании (ООП) объекты образуют отношения и взаимодействуют друг с другом. Например, объект "водитель" может воздействовать на объект "автомобиль", вызывая его поведенческие функции (методы), такие как "запустить двигатель" или "повернуть".
Тип объекта всегда ссылочный, в то время как все структуры имеют значимый тип. Однако все структуры все же наследуют от Object, хотя обычно структуры не могут наследоваться ни от чего.
Экземпляры класса, известные также как объекты, содержат информацию о своем типе, которая хранится в начале объекта. Нет необходимости специально изменять эту информацию, чтобы объект работал.
Это особый класс, который обладает знаниями и информацией, недоступными обычным людям. Он хранит информацию о своем типе в начале объекта, поэтому нет необходимости переопределять его специальным образом для работы. Вот еще несколько сведений для разнообразия: объекты - это ссылочные типы данных, в то время как структуры - это значимые типы данных. Однако все структуры наследуются от класса Object, хотя в обычной ситуации они не наследуются от ничего. Во втором случае все работает, потому что все объекты наследуются от класса Object, поэтому происходит корректное преобразование типа (или упаковка, в случае int). Как уже упоминалось выше, все структуры наследуются от класса Value type, который, в свою очередь, наследуется от класса Object. Относительно вашего вопроса, ответ очень простой. Переменная str не является строкой, а является объектом. Из-за этого она может принимать значения int. Если интересует подробнее, можете ознакомиться с понятиями Boxing и Unboxing. Относительно строки была и нет, переменная str в первую очередь является переменной, которая ссылается на определенное место в памяти. При присваивании другого значения, эта переменная указывает на другое место в памяти. Можно представить это так: сначала указывал на диван, а потом переключил на стол.
А во втором случае все работает, потому что все объекты наследуются от класса Object, что позволяет применять легальное приведение типов и упаковку (boxing) для int.
Относительно строки и ссылки. Переменная str – это ссылка на место в памяти, а не само значение строки. Когда значение переменной меняется, меняется и содержимое ссылки, поэтому можно сказать, что указатель переключается на другой объект.