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

Я предполагал, что после того, как вы объявили переменную как 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 по-прежнему будет указывать на тот же объект.

Ваше здоровье!