Interface em Java é um dos conceitos centrais. A Interface Java é uma parte fundamental da linguagem de programação Java e é amplamente utilizada, não apenas no JDK, mas também nos padrões de design Java. A maioria dos frameworks faz uso intensivo de interfaces Java.
Interface em Java
A interface em Java oferece uma maneira de alcançar a abstração. A interface Java também é usada para definir o contrato para as subclasses implementarem. Por exemplo, suponha que desejamos criar um desenho composto por várias formas. Podemos criar uma interface
Shape
e definir todos os métodos que diferentes tipos de objetos de forma implementarão. Para simplificar, podemos manter apenas dois métodos – draw()
para desenhar a forma e getArea()
que retornará a área da forma.
Exemplo de Interface em Java
Com base nos requisitos acima, nossa interface Shape ficará assim. Shape.java
package com.journaldev.design;
public interface Shape {
//implicitamente públicos, estáticos e finais
public String LABLE="Shape";
//métodos de interface são implicitamente abstratos e públicos
void draw();
double getArea();
}
Pontos Importantes sobre Interface em Java
-
interface
é o código usado para criar uma interface em Java. -
Não podemos instanciar uma interface em Java.
-
A interface fornece abstração absoluta, no último post aprendemos sobre classes abstratas em Java para fornecer abstração, mas classes abstratas podem ter implementações de métodos, enquanto interfaces não podem.
-
Interfaces não podem ter construtores porque não podemos instanciá-las, e interfaces não podem ter um método com corpo.
-
Por padrão, qualquer atributo de uma interface é public, static e final, então não precisamos fornecer modificadores de acesso para os atributos, mas se o fizermos, o compilador também não reclama.
-
Por padrão, os métodos de uma interface são implicitamente abstractos e publicos. Isso faz total sentido, pois o método não tem corpo e, assim, as subclasses podem fornecer a implementação do método.
-
Uma interface não pode estender nenhuma classe, mas pode estender outra interface.
public interface Shape extends Cloneable{}
é um exemplo de uma interface que estende outra interface. Na verdade, o Java permite herança múltipla em interfaces, o que significa que uma interface pode estender várias interfaces. -
A palavra-chave
implements
é usada por classes para implementar uma interface. -
Uma classe que implementa uma interface deve fornecer implementação para todos os seus métodos, a menos que seja uma classe abstrata. Por exemplo, podemos implementar a interface acima em uma classe abstrata assim:
ShapeAbs.java
pacote com.journaldev.design; public abstract class ShapeAbs implements Shape { @Override public double getArea() { // TODO Auto-generated method stub return 0; } }
-
Sempre devemos tentar escrever programas em termos de interfaces em vez de implementações, para que saibamos antecipadamente que as classes de implementação sempre fornecerão a implementação e, no futuro, se alguma implementação melhor chegar, podemos mudar facilmente para ela.
Exemplo de Implementação de Interface Java
Agora vamos ver algumas implementações de nossa interface Shape em Java. Circle.java
package com.journaldev.design;
public class Circle implements Shape {
private double radius;
public Circle(double r){
this.radius = r;
}
@Override
public void draw() {
System.out.println("Drawing Circle");
}
@Override
public double getArea(){
return Math.PI*this.radius*this.radius;
}
public double getRadius(){
return this.radius;
}
}
Observe que a classe Circle implementou todos os métodos definidos na interface e também possui alguns métodos próprios, como getRadius()
. As implementações de interface podem ter vários tipos de construtores. Vamos ver outra implementação de interface para a interface Shape. Rectangle.java
package com.journaldev.design;
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double w, double h){
this.width=w;
this.height=h;
}
@Override
public void draw() {
System.out.println("Drawing Rectangle");
}
@Override
public double getArea() {
return this.height*this.width;
}
}
Observe o uso da anotação de sobreposição, aprenda sobre anotações em java e por que sempre devemos usar a anotação de sobreposição ao substituir um método em java. Aqui está um programa de teste mostrando como codificar em termos de interfaces e não de implementações. ShapeTest.java
package com.journaldev.design;
public class ShapeTest {
public static void main(String[] args) {
//programação para interfaces não para implementações
Shape shape = new Circle(10);
shape.draw();
System.out.println("Area="+shape.getArea());
//alternando facilmente de uma implementação para outra
shape=new Rectangle(10,10);
shape.draw();
System.out.println("Area="+shape.getArea());
}
}
A saída do exemplo de programa de interface java acima é:
Drawing Circle
Area=314.1592653589793
Drawing Rectangle
Area=100.0
Benefícios da Interface Java
- A interface fornece um contrato para todas as classes de implementação, então é bom codificar em termos de interfaces porque as classes de implementação não podem remover os métodos que estamos usando.
- Interfaces são boas para definir o tipo e criar uma hierarquia de alto nível em nosso código.
- Uma vez que uma classe Java pode implementar várias interfaces, é melhor usar interfaces como superclasse na maioria dos casos.
Desvantagens da Interface Java
Embora as interfaces forneçam muitas vantagens, elas também têm algumas desvantagens.
-
Precisamos escolher os métodos da interface com muito cuidado no momento de projetar nosso projeto, pois não podemos adicionar ou remover nenhum método da interface posteriormente, isso levará a erros de compilação para todas as classes de implementação. Às vezes, isso leva a ter muitas interfaces estendendo a interface base em nosso código, o que se torna difícil de manter.
-
Se as classes de implementação possuem seus próprios métodos, não podemos usá-los diretamente em nosso código porque o tipo de Objeto é uma interface que não possui esses métodos. Por exemplo, no código acima teremos um erro de compilação para o código
shape.getRaio()
. Para superar isso, podemos usar typecasting e usar o método assim:Círculo c = (Círculo) shape; c.getRaio();
Embora o typecasting de classes tenha suas próprias desvantagens.
Isso é tudo o que tenho sobre interface em java. Como usamos interfaces java com frequência, devemos estar cientes de suas características. Certifique-se de usar interfaces no design do sistema e como contrato entre o cliente e as subclasses que implementam as interfaces. Atualização: Java 8 mudou a definição de interfaces com a introdução de métodos padrão e implementação de métodos estáticos. Para mais detalhes, por favor, leia Interface Java 8.
Source:
https://www.digitalocean.com/community/tutorials/interface-in-java