interface (aka, pure abstract class)
-
No method bodies,
No instance fields
-
May not be instantiated
-
Must be implemented to be useful
abstract class
-
Optional method bodies
-
May not be instantiated
-
Must be extended to be useful
(except class methods)
concrete non-final class
-
Required method bodies
-
May be instantiated
-
May be extended
final class
-
Required method bodies
-
May be instantiated
-
May not be extended
Advice:
Make concrete classes final unless they are specifically
designed to be subclassed.