Esta respuesta es genial y verdadera.
Quería agregar que en algunos casos se hicieron compromisos por el bien de la usabilidad.
Los objetos de tipo String se pueden instanciar sin un nuevo evento cuando String no es primitivo:
String s = "Hello";
Al ser una cadena no primitiva, se debe instanciar así:
String s = new String("Hello"); // this also works
Pero el compilador permite la opción más corta y menos OO, porque String es, con mucho, la clase más utilizada en la API.
También las matrices se pueden inicializar de una manera no OO:
int i[] = {1,2,3};
Por extraño que parezca, un objeto es una instancia de una clase o una matriz . Las matrices de significado son un tipo de clase completamente separado.
Las matrices tienen un length
campo público que no es una constante. Además, no hay documentación sobre las matrices de clases de las que se trata. (no confundir con la clase Arrays o java.reflect.Array).
int a = myArray.length; // not length()