2013-03-21 4 views
4

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

Приведенный ниже код работает !!!!!!

public static void main(String args[]) { 
     final StringBuffer a=new StringBuffer("Hello"); 
     a.append("Welcome"); 
     System.out.println(a); 
    } 

Выход:

HelloWelcome

ответ

8

От Java Language Specification (курсив мой):

После окончательного переменная была назначена, она всегда содержит то же значение. Если конечная переменная содержит ссылку на объект, состояние объекта может быть изменено с помощью операций над объектом, но переменная всегда будет ссылаться на один и тот же объект.

Так это нормально, чтобы манипулировать состоянием объекта указываемого a

a.append("Welcome"); //is OK 

но просто не может переназначить a с другим объектом

final StringBuffer a = new StringBuffer("Hello"); 
a = new StringBuffer("World"); //this wont compile 
4

То, что вы не можете сделать с конечной переменной изменить его ссылаться на другой объект (или примитивное значение) или нуль.

Там вы всегда ссылаетесь на один и тот же объект, а stringbuffer, в отличие от строки, не является неизменным.

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

0

Вы должны сделать некоторые читать дальше Mutable and Immutable objects.

Пример неизменяемых классов: String, Integer, Long Пример изменяемых классов: StringBuffer, Дата

В изменяемых объектов можно изменить состояние после его строительства, например,

final StringBuffer a=new StringBuffer("Hello"); 
a.append("Welcome"); 

В неизменяемом состоянии объекта конструкции после его строительства нельзя изменить.

0

, если переменная объявлена ​​окончательным, мы не можем переопределить значение этой переменной

правильно. Как только конечная переменная была назначена, ее нельзя переназначить. Компилятор не допустит этого.

, но это не подходит, если мы используем строковый буфер.

Да, так оно и есть.

Приведенный ниже код работает !!!!!!

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

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