Se está usando herança somente para “digitar menos”, então está usando pelo motivo errado.
Sem contar que herança para acessar métodos estáticos, como já foi dito, é completamente desnecessário - e você ainda “queima” o uso dela, pois em Java cada classe só pode herdar de uma outra classe (então se sua classe precisar estender outra que faz mais sentido, não vai ser possível, porque você já estendeu uma desnecessariamente).
E fazer com que todas as classes herdem o método println
acaba violando o Princípio da Responsabilidade Única. System.out
é uma instância de PrintStream
, que é uma classe que - de forma resumida - “sabe como imprimir coisas”.
No seu caso, como o Objeto
só repassa os argumentos para System.out.println
, podemos dizer que a responsabilidade de Objeto
também é “imprimir coisas na tela”. Ao fazer com que todas as classes do sistema herdem de Objeto
, você está dizendo que todas as classes também são responsáveis por isso (ou seja, elas estão “acumulando funções”, pois cada classe já tem sua própria responsabilidade, e você está dando mais uma para elas) - isso tudo, claro, ignorando o fato de que os métodos são estáticos e na verdade não está tendo uma herança de fato (como já foi bem explicado anteriormente pelo @staroski).
Por fim, se der uma olhada na documentação de PrintStream
, verá que existem vários métodos para imprimir (print
, printf
, write
, etc), sem contar que print
e println
possuem várias versões diferentes (que recebem um int
, double
, array, etc), e isso pode dar diferença, veja:
public class Objeto {
public static void println(Object obj) {
System.out.println(obj);
}
public static void println(String s) {
System.out.println(s);
}
}
// dentro do main
char[] c = "abc".toCharArray();
Objeto.println(c);
System.out.println(c);
Apesar de parecer que vai imprimir a mesma coisa duas vezes, na verdade o código acima imprime o seguinte (a primeira linha pode variar o valor, mas será algo parecido):
[C@15db9742
abc
Isso porque println
tem uma versão que recebe um array de char
, e imprime os caracteres dele. Mas como você não definiu esta versão em Objeto
, o que acaba sendo chamado é a primeira versão do método (o Java tenta encontrar algum método cuja assinatura seja compatível, e como não há nenhum que recebe um char []
, ele acaba caindo na versão que recebe Object
).
E a versão de println
que recebe Object
acaba chamando String.valueOf
, que por sua vez chama o método toString
do objeto em questão - e no caso de arrays, o retorno é esse “texto maluco” aí de cima ([C@15db9742
- veja aqui a explicação deste “código”).
Outro caso que dá diferença:
Objeto.println(null); // imprime "null"
System.out.println(null); // não compila!
Claro que para vários casos (int
, String
's, objetos que implementam toString
, etc) vai funcionar, mas se você não incluir todas as versões de println
no seu Objeto
, podem ter esses corner cases.
Mas tudo isso pode ser evitado se você simplesmente não usar herança onde ela não é adequada