Qual é o método padrão?
Após o lançamento do Java 8, novos métodos podem ser adicionados à interface, mas a interface ainda pode ser compatível com sua classe de implementação. Isso é muito importante porque a biblioteca de classes que você desenvolve pode ser amplamente utilizada por vários desenvolvedores. Antes do Java 8, depois que uma interface foi lançada na biblioteca de classes, se um novo método fosse adicionado à interface, os aplicativos que implementam essa interface estariam em risco de travar usando a nova versão da interface.
Com o Java 8, não existe esse perigo? A resposta é não.
Adicionar um método padrão a uma interface pode tornar algumas classes de implementação indisponíveis.
Primeiro, vejamos os detalhes do método padrão.
No Java 8, os métodos em interfaces podem ser implementados (os métodos estáticos no Java 8 também podem ser implementados em interfaces, mas esse é outro tópico). O método implementado na interface é chamado de método padrão, que é identificado pela palavra -chave padrão como um modificador. Quando uma classe implementa uma interface, ele pode implementar métodos que foram implementados na interface, mas isso não é necessário. Esta classe herdará o método padrão. É por isso que quando a interface muda, a classe de implementação não precisa ser alterada.
Que tal o tempo para herdar mais?
As coisas ficam complicadas quando uma classe implementa mais de uma (por exemplo, duas) interfaces e essas interfaces têm o mesmo método padrão. Qual método padrão a classe herda? Nenhum deles é! Nesse caso, a classe deve implementar o método padrão (somente) por si só (diretamente ou herdando as classes de nível superior na árvore).
O mesmo é verdadeiro quando uma interface implementa o método padrão e a outra interface declara o método padrão como abstrato. O Java 8 tenta evitar coisas pouco claras e mantê -lo rigoroso. Se um método for declarado em várias interfaces, qualquer implementação padrão não será herdada e você receberá um erro de tempo de compilação.
No entanto, se você compilou sua classe, não haverá erros de compilação no tempo. Neste ponto, o Java 8 é inconsistente. Tem suas próprias razões, por várias razões. Não quero explicar em detalhes ou discuti -lo em profundidade aqui (porque: a versão foi lançada e a discussão foi muito longa, e essa plataforma nunca discutiu assim).
A classe pode ser executada normalmente no caso acima. No entanto, ele não pode ser recompilado com interfaces modificadas, mas ainda pode ser executado com interfaces antigas. Próximo
Quando ambas as interfaces fornecem implementações padrão para o mesmo método, esse método não pode ser chamado, a menos que a classe de implementação também implemente o método padrão (implementa diretamente ou herde a classe de nível superior na árvore para implementação).
No entanto, esta classe é compatível. Ele pode ser carregado com novas interfaces, ou mesmo executado, desde que não chama um método que tenha implementação padrão em ambas as interfaces.
Código de exemplo
Para demonstrar o exemplo acima, criei um diretório de teste para C.Java, que possui 3 subdiretos abaixo, que são usados para armazenar i1.java e i2.java. O diretório de teste contém o código -fonte de C.Java da classe C. O diretório base contém a interface para a versão que pode ser compilada e executada. I1 contém o método m () implementado por padrão e i2 não contém nenhum método.
A classe de implementação contém o método principal, para que possamos executá -lo no teste. Ele verificará se existem parâmetros da linha de comando, para que possamos executar facilmente testes que chamam m () e não chamam m ().
public classe C implementa i1, i2 {public static void main (string [] args) {c c = new c (); if (args.length == 0) {cm (); }}} interface pública I1 {padrão void m () {System.out.println ("Hello Interface 1"); }} interface pública i2 {}Use a seguinte linha de comando para compilar e executar:
Javac -cp .: Base C.Javajava -CP .: Interface Base Chello 1
O diretório compatível contém a interface I2 com o método abstrato m () e a interface I1 não modificada.
interface pública i2 {void m ();}Isso não pode ser usado para compilar a classe C:
Javac -cp.
A mensagem de erro é muito precisa. Como temos a C.Class
Javac compatível/i*.javajava -cp .: interface de chello compatível 1
O terceiro diretório chamado Whrado, e a interface i2 contida também define o método m ():
interface pública i2 {padrão void m () {System.out.println ("Hello Interface 2"); }}Nunca devemos nos cansar de compilá -lo. Embora o método m () seja definido duas vezes, a classe de implementação ainda pode ser executada enquanto não chamar o método que foi definido várias vezes, mas desde que chamamos o método m (), ele falhará imediatamente. Aqui estão os parâmetros da linha de comando que usamos:
javac errado/*. javajava -cp.
para concluir
Ao portar a biblioteca de classes que adiciona implementação padrão à interface ao ambiente Java 8, geralmente não haverá problema. Pelo menos é isso que os desenvolvedores da biblioteca de classes Java8 pensam ao adicionar métodos padrão às classes de coleta. Os aplicativos que usam sua biblioteca de classes ainda dependem da biblioteca de classes do Java7 sem o método padrão. Ao usar e modificar várias bibliotecas de classes diferentes, há uma pequena chance de conflito. Como posso evitar isso?
Projete sua biblioteca de classes como antes. Não leve isso de ânimo leve quando você pode confiar no método padrão. Não o use como absolutamente necessário. Escolha o nome do método com sabedoria para evitar conflitos com outras interfaces. Aprenderemos como usar esse recurso para desenvolvimento na programação Java.
Resumir
O acima é o conteúdo inteiro deste artigo. Espero que o conteúdo deste artigo tenha certo valor de referência para o estudo ou trabalho de todos. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar. Obrigado pelo seu apoio ao wulin.com.