What are the differences between final, finally, and finalize?

These are syntactically different concepts even syntactically. Similar to discussing Object methods, this question is a conversation starter.

finalize – This is a finalizer method from the Object class, which is already discussed in the previous post.

final – A modifier that can be applied to variables, fields, methods, and classes. A variable or field declared final becomes immutable and has to be initialized. A final method cannot be overridden in subclasses. A final class cannot have any subclasses at all. It is used to create a good (Effective Java Item 15) API based on the principle of least privilege.

When a method uses a local variable from an outer scope, that variable has to be effectively final. In this case, the final keyword is not mandatory, but the value still must not change.
finally – This is part of the try-catch-finally language construct.

Any exception thrown from the try block moves the execution to the most appropriate catch block, if present. This dictates the need to arrange catch blocks in strict order, from the type of the exception that is a descendant to its parent. In the case of a multicatch, the same order must be maintained within a single catch. More examples about order.

After that the finally block is executed. It executes regardless of whether an exception occurred or not. It is typically used for resource release or other mandatory concluding actions.

For classes that require finalization ("resources"), the AutoCloseable interface is added. Repetitive code of the final block is moved to the close method and is implicitly called at the end of a try-with-resources block. If an explicit finally is also present, it will be executed afterward.