Eu estava lendo Um Guia do Programador para Certificação Java ™ SCJP de Khalid Mughal.
No capítulo Herança, explica que
A herança de membros está intimamente ligada à sua acessibilidade declarada. Se um membro da superclasse for acessível por seu nome simples na subclasse (sem o uso de nenhuma sintaxe extra como super), esse membro será considerado herdado
Ele também menciona que métodos estáticos não são herdados. Mas o código abaixo é perfeitamente correto:
class A
{
public static void display()
{
System.out.println("Inside static method of superclass");
}
}
class B extends A
{
public void show()
{
// This works - accessing display() by its simple name -
// meaning it is inherited according to the book.
display();
}
}
Como posso usar diretamente display()
nas aulas B
? Ainda mais, B.display()
também funciona.
A explicação do livro se aplica apenas a métodos de instância?
java
inheritance
static
Algoritmista
fonte
fonte
Respostas:
Todos os métodos acessíveis são herdados pelas subclasses.
Dos tutoriais Java da Sun :
A única diferença entre os métodos estáticos herdados (classe) e os métodos não estáticos herdados (instância) é que, quando você escreve um novo método estático com a mesma assinatura, o antigo método estático fica oculto, não é substituído.
Da página da diferença entre substituir e ocultar.
fonte
Se é isso que o livro realmente diz, está errado. [1]
A especificação da linguagem Java # 8.4.8 declara:
[1] Não diz isso na minha cópia, 1ª edição, 2000.
fonte
Você pode experimentar a diferença no código a seguir, que é uma pequena modificação em seu código.
Isso ocorre porque métodos estáticos são métodos de classe.
A.display () e B.display () chamarão o método de suas respectivas classes.
fonte
B.display () funciona porque a declaração estática faz com que o método / membro pertença à classe, e não qualquer instância de classe específica (também conhecida como Object). Você pode ler mais sobre isso aqui .
Outro aspecto a ser observado é que você não pode substituir um método estático, sua subclasse pode declarar um método estático com a mesma assinatura, mas seu comportamento pode ser diferente do que você esperaria. Esta é provavelmente a razão pela qual não é considerada herdada. Você pode conferir o cenário problemático e a explicação aqui .
fonte
Os métodos estáticos em Java são herdados, mas não podem ser substituídos. Se você declarar o mesmo método em uma subclasse, oculte o método da superclasse em vez de substituí-lo. Métodos estáticos não são polimórficos. No momento da compilação, o método estático será vinculado estaticamente.
Exemplo:
Você obterá o seguinte:
fonte
Os métodos estáticos são herdados em Java, mas não participam do polimorfismo. Se tentarmos substituir os métodos estáticos, eles apenas ocultarão os métodos estáticos da superclasse em vez de substituí-los.
fonte
Esse conceito não é tão fácil quanto parece. Podemos acessar membros estáticos sem herança, que é a relação HasA. Podemos acessar membros estáticos estendendo a classe pai também. Isso não implica que seja uma relação ISA (herança). Na verdade, os membros estáticos pertencem à classe e o static não é um modificador de acesso. Enquanto os modificadores de acesso permitirem acessar os membros estáticos, podemos usá-los em outras classes. Por exemplo, se for público, estará acessível dentro do mesmo pacote e também fora do pacote. Para particulares, não podemos usá-lo em nenhum lugar. Por padrão, podemos usá-lo apenas dentro do pacote. Mas, para os protegidos, temos que estender a super classe. Portanto, obter o método estático para outra classe não depende de ser estático. Depende dos modificadores de acesso. Então, na minha opinião, Membros estáticos podem acessar se os modificadores de acesso permitirem. Caso contrário, podemos usá-los como usamos na relação Hasa. E tem uma relação não é herança. Novamente, não podemos substituir o método estático. Se podemos usar outro método, mas não podemos substituí-lo, é a relação HasA. Se não pudermos substituí-los, não será uma herança. Portanto, o escritor estava 100% correto.
fonte
O método estático é herdado na subclasse, mas não é polimorfismo. Quando você escreve a implementação do método estático, o método de classe do pai fica oculto, não substituído. Pense, se não for herdado, como você poderá acessar sem
classname.staticMethodname();
?fonte
Todos os membros públicos e protegidos podem ser herdados de qualquer classe, enquanto os membros padrão ou do pacote também podem ser herdados da classe dentro do mesmo pacote que o da superclasse. Não depende se é membro estático ou não estático.
Mas também é verdade que a função de membro estático não participa da ligação dinâmica. Se a assinatura desse método estático for a mesma na classe pai e filho, o conceito de Shadowing se aplica, não o polimorfismo.
fonte
Você pode substituir métodos estáticos, mas se você tentar usar o polimorfismo, eles funcionarão de acordo com o escopo da classe (ao contrário do que normalmente esperamos).
No primeiro caso, o / p é o "no método estático de B" # substituição bem-sucedida No segundo caso, o / p é "no método estático de A" # método estático - não considerará polimorfismo
fonte
Podemos declarar métodos estáticos com a mesma assinatura na subclasse, mas isso não é considerado de substituição, pois não haverá polimorfismo em tempo de execução. time (substituindo no tempo de execução) Portanto, a resposta é 'Não'.
fonte
Muitos expressaram sua resposta em palavras. Esta é uma explicação extensa nos códigos:
Resultados:
Portanto, esta é a conclusão:
null
instância. Meu palpite é que o compilador usará o tipo de variável para encontrar a classe durante a compilação e a converterá na chamada de método estático apropriada.fonte
Membros estáticos são membros universais. Eles podem ser acessados de qualquer lugar.
fonte
Os membros estáticos não serão herdados da subclasse porque a herança é apenas para membros não estáticos. E os membros estáticos serão carregados dentro do conjunto estático pelo carregador de classes. A herança é apenas para os membros carregados dentro do objeto
fonte