Essa resposta é ótima e verdadeira.
Eu queria acrescentar que, em alguns casos, foram feitos compromissos em prol da usabilidade.
Objetos do tipo String podem ser instanciados sem um evento new quando String não é um primitivo:
String s = "Hello";
Sendo uma string não primitiva, deve ser instanciada assim:
String s = new String("Hello"); // this also works
Mas o compilador permite a opção mais curta e menos OO, porque String é de longe a classe mais usada na API.
Também as matrizes podem ser inicializadas de maneira não OO:
int i[] = {1,2,3};
Estranho o suficiente, um objeto é uma instância de uma classe ou uma matriz . Matrizes de significado são um tipo de classe completamente separado.
As matrizes têm um length
campo público que não é uma constante. Além disso, não há documentação nas matrizes de classe das quais é uma instância. (para não confundir com a classe Arrays ou java.reflect.Array).
int a = myArray.length; // not length()