Defining it instead to be a subclass of a base that is not final means that someone at least gets a chance to subclass the base with an alternate implementation, which will essentially always happen in the long run. Never declare instance fields as public. The standard OO reasons. Making fields public gives up control over internal class structure. Also, if fields are public, methods cannot assume that they have valid values.
Static fields act like globals in non-OO languages.
Also, neither static fields nor static methods are overridable in any useful sense in subclasses. Generally prefer long to int , and double to float . On the other hand, because of limitations in Java atomicity guarantees, use of longs and doubles must be synchronized in cases where use of ints and floats sometimes would not be. Access to immutable instance fields generally does not require any synchronization control, but access to mutable fields generally does. Generally prefer protected to private .