为什么我可以更改私有final ArrayList <Book>?

Mar*_*jus 2 java arraylist

我的课程看起来像这样:

public class InformationSystem {
    private final ArrayList<Book> books;
    private final ArrayList<Reader> readers;

    public InformationSystem() {
        books = new ArrayList<Book>();
        readers = new ArrayList<Reader>();
    }

    public void addBook(final String author, final String title) {
        Book book = new Book(author, title);
        books.add(book);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我可以添加/删除最终的arraylist中的值?

Sur*_*tta 15

我无法改变汽车,我仍然能够改变其中的部件:)

来自语言规范#14.12.4

一旦分配了最终变量,它总是包含相同的值.如果最终变量包含对对象的引用,则可以通过对对象的操作来更改对象的状态,但该变量将始终引用同一对象.

你不能重新assign,你仍然可以改变状态.

简而言之

  books  =newBooksList;   // huh! I'm final, No
  books.add(book);       //ok
Run Code Online (Sandbox Code Playgroud)