2013-11-28 4 views
0

Я читал ранее, что классы-оболочки являются неизменными. Неизменяемый означает, что значение не может быть изменено. Ниже я попробовал этот простой пример, который можно просто вставить в любой основной метод. сначала я создаю Integer, который обертывает значение пять. Неизменяемость означает, что они не могут быть изменены, поэтому почему я могу установить значение «Я» 89. Я думаю, что это происходит потому, что оно изменяется там, где (I) указывает, но я не уверен, почему это так.Почему у неизменяемого класса Integer значение сброшено?

В следующем примере я создаю целое число x, которое вызовет ошибку, если я попытаюсь изменить его. В этом конкретном случае х представляется неизменным, но не в случае переменной (i).

Кажется, что я могу изменить значение (i) всякий раз, когда я хочу так на самом деле. Целое число без ключевого слова final не является неизменным ???? Если я могу установить значение 89, то мне кажется, что переменную можно изменить.

Я прочитал другое сообщение по этому вопросу, и я до сих пор не уверен, почему я могу быть заменен на другую переменную. Также при написании кода лучший способ объявить примитивные типы. Почему бы не использовать классы-оболочки все время для создания переменных.

int y = 5; 
Integer i = new Integer(y); 
i = 89; 
final Integer x = Integer.valueOf(5); 

System.out.println("Integer:(i) " + i.intValue()); 
System.out.println("Integer:(i) " + i.byteValue()); 

System.out.println("Integer:(x) " + x.intValue());; 
System.out.println("Integer:(x) " + x.byteValue());; 

i = i - 5; 

Используя все классы для объявления переменных: (это было бы лучше, чем объявить эти переменные с примитивными типами переменных)

Integer a = new integer(MyNewValue); 
Integer b = new integer(MyNewValue); 
Integer c = new integer(MyNewValue); 
Integer d = new integer(MyNewValue); 
Float fa = new integer(MyNewValue); 

ответ

1

Когда вы вызываете i = 89;, ваше изменение значения объекта Integer сохраняется в памяти. Вместо этого вы назначаете новый int со значением от 89 до i. Поэтому неизменяемое правило не нарушается.

Помните, что i - это просто ссылка, которая указывает на Integer, а не на фактический Integer.

+0

Итак, как бы вы нарушили неизменяемое правило для Java Integer? –

+0

Как вы сказали, вы не можете. Извините, если я предположил, что это возможно. Каждый раз, когда вы выполняете какую-либо операцию над «Integer» (добавление, смещение бит и т. Д.), Вы получаете только новое значение. Отвечает ли это на ваш вопрос? –

+0

Вид.Позвольте мне показать пример. Если у меня есть Integer a = new Integer (100); поэтому значение a равно 100. Я не могу сбросить это значение до 50, потому что Integer неизменен, но если я установил значение a в значение int, которое я объявил ранее, я мог бы изменить i, но не повлиять на то, что Integer a ссылается на , Так что это действительно было бы в стороне от этой части неизменности. верный. –

2

Вы приравнивая две вещи: изменение значения «объект "и изменить объект, на который указывает эта точка. Высказывание i = 89 просто указывает переменную i на новый объект; он не изменяет объект Integer, на который первоначально указывалось i.

Предваряемые объявления переменных с final просто гарантируют, что переназначение запрещено, это никоим образом не является декларированием изменчивости/неизменности объекта, на который он указывает. Может быть, не по теме, но я лично думаю, что статья Java is Pass-by-Value, Dammit! хорошо читается.

1

Да, это похоже на то, что целое число меняется, но все, что происходит в строке 3, это преобразование его в i = new Integer(89) компилятором. Если вы хотите увидеть, вы могли бы сделать

Integer i1 = i; 
i = 83; 
println(i); \\ prints out the original value 5 
println(i1); \\ prints out a new value, 83 

Когда вы заявляете что-нибудь, как окончательное, вы не можете изменить определение переменной, хотя вы все еще можете мутировать ничего внутри него. JavaRanch has a very nice analogy to help

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

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