Programação Orientada a Objetos II Java Décima primeira aula 1
Programação Orientada a Objeto II Classes Abstratas Interfaces 2
Métodos abstratos Métodos abstratos não possuem implementação (corpo) Para criar um método abstrato, simplesmente escreva a declaração do método sem o corpo do método e use palavra chave abstract public abstract void somemethod(); Note que o método não possui corpo - Não usar as { 3
Classes abstratas Uma classe abstrata é uma classe que possui um ou mais métodos abstratos Uma classe abstrata não pode ser instanciada Este comando produzirá um erro de compilação Para implementar os métodos da classe abstrata há que estendê-la em sub-classes concretas Usar a palavra-chave extends MyAbstractClass a1 = new MyAbstractClass(); 4
Exemplo public abstract class SerVivo{ public void respirar(){ System.out.println( Ser vivo respirando ); public void comer(){ System.out.println( Ser vivo comendo "); public abstract void andar(); Método abstrato, a ser implementado por uma classe concreta 5
Estendendo uma classe abstrata A sub-classe SerHumano estende a classe abstrata SerVivo. Se a sub-classe SerHumano não implementar o método andar() ela se tornará uma classe abstrata também public class SerHumano extends SerVivo{ public void andar(){ System.out.println( Seres humanos andam..."); 6
Quando usar Métodos abstratos e Classes abstratas? Usar uma classe abstrata para definir um comportamento amplo e criar sub-classes estendendo-a para diversificar os detalhes desse comportamento 7
O que é uma interface? Uma interface estabelece uma forma pública e padronizada para especificar o comportamento de classes Um contrato! Todos os métodos de uma interface são abstratos Os termos que regem o contrato estão escritos na assinatura dos métodos da interface Classes concretas implementam a interface 8
Exemplo Note que a interface contém apenas as assinaturas dos métodos - Nenhuma implementação public interface Relation { public boolean ehmaior( Object a, Object b); public boolean ehmenor( Object a, Object b); public boolean ehigual( Object a, Object b); O modificador Abstract é desnecessário 9
Exemplo 2: Interface CarroOp public interface OperateCar { int turn(direction direction, double radius, double startspeed, double endspeed); int changelanes(direction direction, double startspeed, double endspeed); int signalturn(direction direction, boolean signalon); int getradarfront(double distancetocar, double speedofcar); int getradarrear(double distancetocar, double speedofcar);... 10
Razões par usar interfaces - 1 Para permitir que classes não-relacionadas implementem métodos similares (comportamentos) Line e MyInteger são classes: - Elas não são relacionadas através de herança. - Você precisa que ambas implementem métodos de comparação. Defina uma interface Comparison com os esses 3 métodos abstratos ( y checkisgreater(object x, Object ( y checkisless(object x, Object ( y checkisequal(object x, Object 11
Razões par usar interfaces - 2 Para modelar herança múltipla Uma classe pode implementar diversas interfaces mas pode estender apenas uma classe 12
Interfaces x Classes abstratas Todos os métodos de uma interface são abstratos Nem todos os métodos de uma classe abstrata são abstratos Uma interface só pode definir constantes Classes abstratas podem possuir campos 13
Interfaces x Classes abstratas Interfaces não possuem relacionamento de herança direto com classes particulares - Interfaces são definidas de forma independente Métodos abstratos de classes abstratas precisam do modificador abstract Interfaces podem possuir relacionamento de herança entre si 14
Instância como um tipo 15
Exemplo: Instância como um tipo Imagine que a classe Person implementa a interface PersonInterface Person p1 = new Person(); PersonInterface pi1 = p1; PersonInterface pi2 = new Person(); 16
Interfaces e classes - aspectos comuns Ambas são tipos assim uma interface pode ser usada onde se espera uma classe // Prática recomendada PersonInterface pi = new Person(); // Prática não recomendada Person pc = new Person(); 17
Os métodos de uma interface são todos abstratos - Não podem possuir um corpo Você não pode criar uma instância de uma interface Uma interface só pode ser implementada por classes ou estendida por outras interfaces 18
Definindo interfaces A sintaxe para definir uma interface é public interface [InterfaceName] {... Alguns métodos sem corpo 19
Exemplo -1 public interface Relation { public boolean isgreater( Object a, Object b); public boolean isless( Object a, Object b); public boolean isequal( Object a, Object b); 20
Exemplo -2 public class Line implements Relation { private double x1; private double x2; private double y1; private double y2; public Line(double x1, double x2, double y1, double y2){ this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2; 21
Exemplo -3 pubic double getlength(){ double length = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)* (y2-y1)); return length; public boolean isgreater( Object a, Object b){ double alen = ((Line)a).getLength(); double blen = ((Line)b).getLength(); return (alen > blen); 22
Implementando interfaces Line.java:4: Line is not abstract and does not override abstract method isgreater(java.lang.object,java.lang.object) in Relation public class Line implements Relation 1 error ^ Ao implementar uma interface, confira se implementou todos os métodos da interface, senão receberá um erro 23
Interface e classes Uma classe concreta só pode estender uma superclasse, mas pode implementar diversas interfaces Java não permite herança múltipla, mas interfaces oferecem uma alternativa Todos os métodos abstratos de interface precisam ser implementados por classes concretas 24
Implementando múltiplas interfaces public class ComputerScienceStudent extends Student implements PersonInterface, AnotherInterface, Third interface{... Todos os métodos abstratos das três interfaces precisam ser implementados 25
Herança entre interfaces Interfaces não fazem parte da hierarquia de classes mas podem manter relacionamento de herança entre sí public interface PersonInterface { void dosomething(); public interface StudentInterface extends PersonInterface { void doextrasomething(); 26
Interfaces e polimorfismo 27
Reescrevendo interfaces - 1 public interface DoIt { void dosomething(int i, double x); int dosomethingelse(string s); A interface antiga A interface nova public interface DoIt { void dosomething(int i, double x); int dosomethingelse(string s); boolean diditwork(int i, double x, String s); 28
Reescrevendo interfaces - 2 Ao fazer tal mudança, todas as classes que implementam a interface antiga deixarão de funcionar pois elas não implementam todos os métodos da interface nova 29
Reescrevendo interfaces - 3 public interface DoItPlus extends DoIt { boolean diditwork(int i, double x, String s); Agora os usuários podem continuar usando a interface velha ou mudar (upgrade) para a nova 30