«Сегодня я узнал, что только конструкторы могут устанавливать значение конечной переменной, которая не инициализируется при объявлении. А объект, на который указывает последняя ссылка на переменную, может быть изменен, но не может быть заменен другим объектом ».
Я предполагал, что после того, как вы объявили переменную как final и не инициализировали ее значением, переменная будет иметь то, что считается значением по умолчанию для этого типа, и это больше не будет изменено. Однако это было не так.
Я также предполагал, что если конечная переменная имеет значение какого-то типа, это значение не может быть изменено каким-либо образом. Но это было не так, поскольку мы могли легко изменить поля значения, если это объект.
Итак, я создал следующий фрагмент кода, чтобы показать эти атрибуты «final» в Java.
«Только конструкторы могут устанавливать значение конечной переменной, которая не инициализируется при объявлении».
class Person { final Book book; public Person(Book book) { this.book = book; // OK to set a value to the final variable } public Book getBook() { return book; } // This method gives the error public void setBook(Book book) { this.book = book; // Cannot assign a value to final variable. } }
«Объект, на который указывает ссылка последней переменной, может быть изменен, но не может быть заменен другим объектом».
class Book { private String author; public Book(String author) { this.author = author; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } } public static void main(String[] args) { Book book = new Book("J.K. Rowling"); Person person = new Person(book); // Book{author='J.K. Rowling'} System.out.println(person.getBook()); // It is legal to modify the final object // but we cannot set a new object. person.getBook().setAuthor("Stephen King"); // Book{author='Stephen King'} System.out.println(person.getBook()); }
Представьте, что переменная book указывает на место в памяти, где объект Book с автором «J.K. Роулинг ». Если вы не попытаетесь изменить место, на которое указывает book, вы можете изменить значения этого объекта, поскольку переменная book по-прежнему будет указывать на тот же объект.
Ваше здоровье!