For Java, the idea was to force OO from the ground up. As an added benefit, the class, together with its full name now formed a kind of namespacing for free functions.
Notes on namespacing
In the case of C++, there are two competing ways to namespace a function, you can either wrap a function in a namespace, or have it be a static method of a class. Similarly the same holds for globals and static member variables.
In fact, they are then called similarly
This causes a design conundrum: when should we use namespace + free function and when should we use class + static method. Usage and performance is roughly equivalent after all.
This is avoided in Java, where only the latter would occur. The typical pattern (esp with early POJO java) would be to create abstract utility classes (today interfaces work too) to hold free functions, with this abstract class forming the namespace.
When designing a language that has both static methods and free functions, one would have to ask oneself: "how do I prevent users from being confused regarding how to distribute functions?".
In Zig, observing this tension between namespaced free function and static struct methods, made the language embrace using structs as namespaces, leading to novel behaviour such as "a file is a struct" in Zig. So
As a contrast, a similar observation for C3 led to the complete removal of static methods and static variables for types. In that language, there is then only