Classe object

Bom dia amigos, tenho uma duvida, talvez até bem besta.
Se todo mundo herda a classe object, por que ela tem método protected? Que são o Clone e Finalize

Primeiro, vamos relembrar que o java possui quatro modificadores de acesso: o "padrão’ (sem nada), o public (permite acesso irrestrito), o private (não permite acesso senão através da própria classe e/ou seus objetos) e o protected.
Este último permite que apenas as classes (e seus objetos) dentro do mesmo pacote ou que estendam daquela classe possam acessar seus métodos/atributos.
Logo, Object pode ter protected sim e isso não inviabiliza nada em termos de orientação a objetos.

Beleza, eu sei que não influência em nada. A treta que tenho duvida é, por que existir? Todo mundo extend Object, não faz sentido ser protected, ja que todos vão ver.
Eu queria saber se tem algum motivo pra ser assim.

Não são todos que vão ver, só quem estender.
Você não consegue fazer isso:

Object meuObjeto = /* tanto faz como foi inicializado */;
meuObjeto.clone(); // erro de compilação, clone não é visível
meuObjeto.finalize(); // erro de compilação, finalize não é visível
2 curtidas

No caso, estender diretamente?

Não, indiretamente também

public class MinhaClasse {

    void algumMetodo() throws Throwable {
        clone(); // consegue enxergarr o clone
        finalize(); // consegue enxergar o finalize
    }
}
2 curtidas

Por que eu não consigo fazer isso?

Por causa do modificador de acesso definido, conforme o @darlan_machado já explicou.

Veja a tabela abaixo, talvez fica mais fácil de entender:

+-------------------------------------------------------------------------------+
|                 |                      QUEM ENXERGA?                          |
|   MODIFICADOR   +-------------+---------------+--------------+----------------+
|                 | TODO MUNDO  | SUB CLASSES   | MESMO PACOTE | PRÓPRIA CLASSE |
+-----------------+-------------+---------------+--------------+----------------+
| public          |     SIM     |      SIM      |     SIM      |      SIM       |
+-----------------+-------------+---------------+--------------+----------------+
| protected       |     ---     |      SIM      |     SIM      |      SIM       |
+-----------------+-------------+---------------+--------------+----------------+
| (nenhum)        |     ---     |      ---      |     SIM      |      SIM       |
+-----------------+-------------+---------------+--------------+----------------+
| private         |     ---     |      ---      |     ---      |      SIM       |
+-----------------+-------------+---------------+--------------+----------------+
3 curtidas

Eu creio que a dúvida dele vem do “poxa, mas se todo mundo herda (a.k.a é sub classe) de Object, então pq n consigo usar o método em X caso?”, daí a afirmativa que ter um método protected que todo mundo herda é meio “injustificável”.

Se essa for a dúvida, a resposta é basicamente o trecho que o @staroski postou:

Object meuObjeto = /* tanto faz como foi inicializado */;
meuObjeto.clone(); // erro de compilação, clone não é visível
meuObjeto.finalize(); // erro de compilação, finalize não é visível
1 curtida

Acho que entendi a ideia agora pessoal. Obrigado pela ajuda.