Eu estava aprendendo por meio de interfaces quando percebi que agora você pode definir métodos estáticos e padrão em uma interface.
public interface interfacesample2 {
public static void method() {
System.out.println("hello world");
}
public default void menthod3() {
System.out.println("default print");
}
}
Explique a diferença dos dois e também se houver um exemplo de quando usaríamos isso, seria bom. Um pouco confuso em Interfaces.
default implementation
de um método que pode ser sobrescrito.Respostas:
Diferenças entre métodos estáticos e padrão em Java 8:
1) Os métodos padrão podem ser substituídos na implementação da classe, enquanto os estáticos não podem .
2) O método estático pertence apenas à classe Interface, então você só pode invocar o método estático na classe Interface, não na classe que implementa esta Interface, consulte:
3) Tanto a classe quanto a interface podem ter métodos estáticos com os mesmos nomes e nenhum substitui o outro!
fonte
purpose
( use uma implementação comum ) e resolvem a ambigüidadeimplementing the logic again in subclass
( sobrescrevendo, ocultando ). a única razão sensata seria a de que [os métodos de interface estática não são herdados] ( stackoverflow.com/questions/25169175/… ) e, portanto, não podemos chamá-los usando uma instância de subclasse.Um método estático é um método que se aplica ao 'namespace' da classe, por assim dizer. Portanto, um
static
métodofoo
de interfaceInterface
é acessado porInterface.foo()
. Observe que a chamada de função não se aplica a nenhuma instância particular da interface.Uma implementação padrão,
bar
por outro lado, é chamada porUm
static
método de interface não pode saber sobre athis
variável, mas uma implementação padrão pode.fonte
Os métodos de interface estática são como métodos de classe estáticos (aqui eles pertencem apenas à Interface). Onde, como os métodos de interface padrão fornecem métodos
default implementation
de interface (que classes de implementação podemoverride
),mas lembre-se, no caso de uma classe ser a
implementing more than one interface with same default
assinatura de método, então a classe de implementaçãoneeds to override the default method
Você pode encontrar um exemplo simples abaixo (pode DIY para casos diferentes)
Isso depende da definição do seu problema. Eu diria que os métodos padrão são úteis, se você precisa da mesma implementação para um método em sua especificação em todas as classes desse contrato, ou pode ser usado como
Adapter
classes.aqui está uma boa leitura: /software/233053/why-were-default-and-static-methods-added-to-interfaces-in-java-8-when-we-alread
também abaixo do documento oracle explica os métodos padrão e estáticos para a evolução das interfaces existentes:
http://docs.oracle.com/javase/tutorial/java/IandI/nogrow.html
fonte
Aqui está a minha opinião:
método estático na interface:
Você pode chamá-lo diretamente (InterfacetA.staticMethod ())
A subclasse não poderá ser substituída.
A subclasse pode ter um método com o mesmo nome de staticMethod
método padrão na interface:
Você não pode ligar diretamente.
A subclasse será capaz de substituí-lo
Vantagem:
Método estático: Você não precisa criar uma classe separada para o método do utilitário.
Método padrão: fornece a funcionalidade comum no método padrão.
fonte
Este link tem alguns insights úteis, listamos alguns deles aqui.
os métodos padrão e estáticos eliminaram as diferenças entre interfaces e classes abstratas .
Métodos padrão de interface :
Métodos estáticos de interface :
Gostaria de citar outra referência útil .
fonte
Métodos padrão de interface:
Isso ajuda a evitar classes de utilitário, como todos os métodos de classe de coleções podem ser fornecidos nas próprias interfaces.
Ele ajuda a estender as interfaces sem medo de quebrar as classes de implementação.
Métodos estáticos de interface:
Eles são parte da interface, não podemos usá-los para objetos de classe de implementação.
Ajuda a fornecer segurança, não permitindo que classes de implementação os substituam.
Agora, como método estático fornecendo segurança. Vamos ver um exemplo.
Aqui,
obj.newMethod();
imprimir a lógica de implementação da classe significa que podemos alterar a lógica desse método dentro da classe de implementação.Mas a
obj.anotherNewMethod();
lógica de implementação da classe de impressão, mas não mudou a implementação da interface. Portanto, se houver qualquer lógica de criptografia-descriptografia escrita dentro desse método, você não poderá alterar.fonte
De acordo com os Javadocs da Oracle: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
Normalmente, o método estático na interface é usado como métodos auxiliares, enquanto o método padrão é usado como uma implementação padrão para as classes que implementam essa interface.
Exemplo:
fonte
De acordo com o documento Java14 JLS:
Método padrão:
É um método de instância declarado em uma interface com o modificador padrão
Ele pode ser acessado apenas pela instância da classe de implementação apenas
Seu corpo é sempre representado por um bloco, que fornece uma implementação ou comportamento padrão para qualquer classe de implementação sem substituir o método
Nunca pode ser estático ou privado
Método estático:
Ele pode ser chamado pela interface sem referência a um objeto específico, assim como os métodos estáticos de classe
O método estático pode ser privado
A classe de implementação não pode acessar o método estático
Vamos entender com a ajuda do código de exemplo abaixo:
fonte
não podemos executar
Interfacesample2.menthod3();
porque não é um método estático. Para executarmethod3()
, precisamos de uma instância deInterfacesample2
interface.Encontre o seguinte exemplo prático:
fonte
Iniciar a interface Java 8 também pode ter um método estático. Como o método estático de uma classe, o método estático de uma interface pode ser chamado usando o nome da interface.
Exemplo
A diferença entre o método estático e o método padrão da interface é que o método padrão suporta herança, mas o método estático não. O método padrão pode ser substituído na interface de herança.
Aqui está uma boa leitura sobre o método padrão da interface e o método estático. Método padrão de interface em Java 8
fonte
Todas as boas respostas aqui. Eu gostaria de adicionar outro uso prático da função estática na interface. A dica vem do livro - Effective Java, 3rd Edition de Joshua Bloch no Capítulo 2: Criando e destruindo objeto.
Os métodos de fábrica estáticos são métodos que retornam um objeto. Eles funcionam como construtores. Em casos específicos, o método de fábrica estático fornece código mais legível do que usar o construtor.
Citando o livro - Effective Java, 3rd Edition de Joshua Bloch
O autor dá um exemplo de coleções onde esse método de fábrica estático é implementado. Verificando o código, Josh Bloch pode ser visto como o primeiro autor da classe Coleções. Embora Collections seja uma classe e não uma interface. Mas o conceito ainda se aplica.
Além disso, ele explica que a API não é apenas menor, ela ajuda na legibilidade do código e na facilidade da API.
Aqui está um dos métodos estáticos da classe java.util.Collections:
fonte