[MÚSICA] Este
é o curso de orientação a objetos com Java.
Meu nome é Eduardo Guerra.
Hoje vamos falar sobre interfaces Java.
Na aula anterior a gente falou sobre as interfaces de uma forma mais geral,
agora vamos entender como que funcionam essas interfaces na linguagem Java.
Então vamos lá.
A gente terminou o exemplo que a gente utilizou na outra aula foi aí
o da interface móvel.
Então teríamos aí a classe cavalo, a classe carro,
todas essas implementando a interface móvel.
Como que eu defino uma interface Java?
Então, ao invés de eu criar, por exemplo, "public class",
eu vou criar uma "public interface móvel".
E aí eu vou definir quais são os métodos que têm naquela interface.
Só que ao invés de eu pegar e colocar a implementação do método,
eu vou colocar ponto e vírgula depois que eu terminar de defini-lo.
O que significa isso?
Significa que aquele método não tem implementação.
Ele vai ser método abstrato.
Como a gente viu lá nas classes abstratas.
E aí você me pergunta porquê que eu não coloco "Abstract" naquele método?
A resposta é: você pode colocar "abstract" naquele método,
mas a questão é que todos os métodos de uma interface, eles sempre são abstratos.
Então, é opcional você colocar ou não a palavra "abstract" no método da interface.
Mas você pode colocar.
Porquê?
Porque ele é abstrato.
Esses métodos da interface eles vão ser bem no estilo,
por exemplo, dos métodos de uma classe, daquele método da classe abstrata,
que você deixa ele sem uma definição concreta.
É aquele que vai ser obrigatório de ser implementado na
subclasse ou pelo menos numa subclasse concreta.
Então, o quê que você pode colocar numa interface?
Numa interface você pode colocar métodos abstratos, dessa forma que eu mostrei e
você pode também colocar atributos finais e estáticos, ou seja, constantes,está?
Ou seja, você fala assim: olha, estou definindo aqui,
por exemplo, public, static, W, π.
Aí você tá definindo lá a constante π.
Então esse tipo de definição, constantes,
que são aquelas variáveis que são statical 5, essas você pode definir numa interface.
Agora, todo o resto você não pode.
Você não pode colocar atributos de instância,
você não pode definir métodos, mas só se esse método for abstrato, aí pode.
Agora, definir a implementação de método numa interface, você não pode.
O quê que vai acontecer, por exemplo, com uma classe que implementar?
Então a gente utiliza a palavra "implements"
para dizer que uma classe ela tem aquela interface.
E aí no momento, por exemplo, se eu definir "public class Cavalo,
implements Movel", significa que aquela classe "cavalo" precisa
implementar todos aqueles métodos que eu defini na minha interface móvel.
Aí você me pergunta: e se a classe for abstrata?
Se a classe for abstrata, é como se aqueles métodos da interface fossem
os métodos abstratos daquela classe, se você não quiser defini-las.
Está? Então, por exemplo, imagine aqui que eu
pego a classe veículo, que é uma classe abstrata e implemento o Movel.
O quê que vai acontecer?
Essa classe abstrata,
ela pode implementar todos os métodos da interface, mas ela não é obrigada.
E aí, mesmo que eu não coloque nada,
é como se aquele método fosse método abstrato daquela classe.
E aí, todas as subclasses que forem concretas,
essas sim são obrigadas a implementar todos os métodos da interface.
Porquê?
Porque se uma classe ela estende uma classe que estende uma interface,
ela também implementa aquela interface.
Ela também pode ser passada por parâmetro onde eu disser que aceito uma
classe que implemente aquela interface.
Qualquer subclasse de uma classe que complementa a interface também vai ser uma
classe que implementa.
Uma coisa interessante na interface, que é diferente da herança das
classes que eu só posso estar estendendo uma classe,
uma interface ela também pode estender outras interfaces,
só que ela pode estender mais de uma.
Diferente da classe, que só pode estender uma outra classe ou pode estender duas,
uma interface pode estender outras interfaces, mais de uma.
Então por exemplo,
imagine que eu tenho aí uma interface com canais, uma interface ligável,
eu posso ter uma interface televisor, que estende essas duas interfaces.
O quê que significa isso?
Que essa interface que estende as duas, el tem que ter,
é como se ela definisse todos os métodos que aquelas interfaces possuem.
Além de uma interface poder estender mais de uma interface,
uma classe pode implementar mais de uma interface.
Então por exemplo, imagine que estou definindo uma classe SmartTV,
que implementa televisor e player de vídeo.
Então a diferença vai ser: aquela classe vai ter que definir todos
os métodos que estão na interface televisor e todos os métodos que estão na
interface do player de vídeo.
E aí, mesma coisa, ela vai ter todas aquelas interfaces.
E aí se eu pergunto, por exemplo: essa classe SmartTV,
ela vai implementar interface com canais?
Sim, com certeza.
Porquê?
Porque ele implementa televisor e televisor,
como a gente viu aqui, estende o com canais.
Então, indiretamente, a classe SmartTV tem aquela interface, porquê?
Porque ela de uma certa forma precisou também definir todos os métodos
que estavam nela.
Então resumindo pouco aqui: uma classe pode implementar
mais de uma interface e uma interface pode estender mais de uma interface.
Então a herança de interfaces não tem essa restrição que tem a herança de classes,
que diz que a classe só pode estender uma outra classe.
E a interface pode estender mais de uma interface.
E a classe pode implementar mais de uma interface, como a gente viu.
Então com isso espero que você,
na aula anterior a gente viu os conceitos sobre interface e nessa aula
a gente viu pouco sobre como estar utilizando esse conceito
de interfaces dentro da linguagem Java, entendendo aí como definir uma interface,
como fazer uma classe, implementar uma interface, entendendo aí que uma classe
pode implementar várias interfaces, ou uma interface pode estender outras interfaces.
Espero que tenha ficado claro.
Muito obrigado.
Até à próxima aula, onde vamos nos aprofundar ainda mais nesse conceito.
[MÚSICA]