Programação Orientada a Objetos com Java Módulo 07 Características Avançadas de Classes Última Atualização: 15/06/2010 1 Programação Orientada a Objetos com Java Objetivos • Descrever variáveis, métodos e iniciadores static • Descrever a semântica do modificador final em classes, métodos e variáveis. • Explicar como e quando utilizar classes e métodos abstract • Explicar como e quando utilizar uma Interface 2 Programação Orientada a Objetos com Java A Palavra Reservada static • A palavra reservada static é utilizada como um modificador em variáveis, métodos e classes aninhadas (inner classes). • A palavra reservada static declara que o atributo ou método é associado com a classe como um todo ao invés de ser associado com uma instância em particular da classe. • Portanto, membros static são freqüentemente conhecidos como membros da classe, atributos da classe ou métodos da classe 3 Programação Orientada a Objetos com Java Atributos da Classe • São compartilhados por todas as instâncias de uma classe public class Contador; public static int contador; private int numeroIdentificacao; public Contador() { contador++; // Uma instância consegue acessar o atributo da classe numeroIdentificacao = contador; } } 4 Programação Orientada a Objetos com Java Acessando Atributos Estáticos • Podem ser acessados fora dos limites da classe, sem uma instância da classe (se declaradas com o modificador de acesso adequado). 1 public class TestaContador { 2 public static void main (String [ ] args) { 3 Contador.contador++; // Variável contador com modificador de acesso adequado. 4 Contador c = new Contador(); 5 c.contador++; // É possível acessar um membro estático a partir de uma instância da classe 6 System.out.println(Contador.contador); // Qual o valor exibido? 7 } 8 } 5 Programação Orientada a Objetos com Java Acessando Métodos Estáticos • Podemos chamar um método estático sem uma instância da classe a qual o método pertence. 1 public class Contador2 { 2 private int numeroIdentificao; 3 private static int contador; 4 5 public static int getContador() { // Veja forma de acesso, via método, no próximo slide 6 return contador; 7 } 8 9 public Contador2() { 10 contador++; 11 numeroIdentificacao = contador; 12 } 13} 6 Programação Orientada a Objetos com Java Acessando Métodos Estáticos (Cont.) 1 public class TestaContador2 { 2 public static void main(String[] args) { 3 System.out.println(“O valor do contador é “ +Contador2.getContador()); 5 Contador2 c = new Contador2(); // Segunda maneira de acesso 6 System.out.println( "O valor do contador é " + c.getContador()); 8 } 9} A saída do programa TestaContador2: O valor do contador é 0 O valor do contador é 1 7 Programação Orientada a Objetos com Java Iniciadores Estáticos • Uma classe pode conter código em um bloco estático que fica fora do conteúdo de um método. • Blocos estáticos executam somente uma vez, quando a classe é carregada. • Um bloco estático é normalmente utilizado para iniciar atributos estáticos de uma classe. 8 Programação Orientada a Objetos com Java Iniciadores Estáticos 1 public class TestaIniciadorEstatico { 2 public static int contador; 3 static { // Início do bloco estático. Executado no momento de carregamento da classe 4 // Lê o argumento via linha de comando (Discutido novamente no capítulo 9) 4 contador= Integer.getInteger("parametroLinhaComando"); 5 } 6 7 public static void main(String[] args) { 8 System.out.println(TestaIniciadorEstatico.contador); 9 } 10 } A saída do programa TestaIniciadorEstatico é: java -DparametroLinhaComando=5 TestaIniciadorEstatico contador= 5 9 Programação Orientada a Objetos com Java O Design Pattern “Singleton” 10 Programação Orientada a Objetos com Java Implementando o Design Pattern “Singleton” O código Singleton : 1 package transportadora.dominio; 2 3 public class Companhia { 4 private static Companhia instancia = new Companhia(); 5 private String nome; 6 private Veiculo[] frota; 7 8 public static Companhia getCompanhia() { 9 return instancia; 10 } 11 12 private Companhia() {...} // Repare que o construtor deve ser private !!! 13 14 // mais código ... 15 } 11 Programação Orientada a Objetos com Java Implementando o Design Pattern “Singleton”(Cont.) Código que utiliza o Singleton: 1 package transportadora.relatorios; 2 3 import transportadora.dominio.*; 4 5 public class RelatorioNecessidadeCombustivel { 6 public void geraRelatório() { 7 Companhia c = Companhia.getCompanhia(); 8 // use o objeto do tipo Companhia para recuperar a frota de veículos 9 ... 10 } 11 } 12 Programação Orientada a Objetos com Java A Palavra Reservada final • Não podemos especializar (criar uma subclasse) declarada como final. • Não podemos sobreescrever um método final. •Uma variável declarada com final se torna uma constante. • Podemos iniciar o conteúdo de uma variável final apenas uma vez, mas a atribuição não necessita ser feita no momento da declaração (Variável final não iniciada - “blank final variable.”) 13 Programação Orientada a Objetos com Java A Palavra Reservada final • Uma variável de classe final, não iniciada deve ser iniciada no construtor da classe. • Uma variável local final, não iniciada deve ser iniciada no conteúdo do método antes de ser utilizada. • Uma variável de classe definida como static final deve ser iniciada explicitamente ou dentro de um bloco estático. Não pode ser iniciada dentro de um construtor. • Uma variável de referência final não pode apontar para outros objetos. 14 Programação Orientada a Objetos com Java Variáveis final Constantes: public class Matematica { private static final double PI=3.1213; ... // mais declarações } Variável de classe final não iniciada: public class Cliente { private final long idCliente; public Cliente() { idCliente = criaId(); } public long getId() { return idCliente; } private long criaId() { return ... // gera um novo Identificador } ... // mais declarações} 15 Programação Orientada a Objetos com Java Classes Abstratas: Cenário Código inicial da frota: 1 public class TransportadoraPrincipal { 2 public static void main(String[] args) { 3 Companhia c = Companhia.getCompanhia(); 4 // preenche a companhia com uma frota de veículos 5 6 c.adicionarVeiculo(new Caminhao(10000.0) ); 7 c.adicionarVeiculo(new Caminhao(15000.0) ); 8 c.adicionarVeiculo(new Balsa(500000.0) ); 9 c.adicionarVeiculo(new Caminhao(9500.0) ); 10 c.adicionarVeiculo(new Balsa(750000.0) ); 11 12 RelatorioNecessidadeCombustivel relatorio = new RelatorioNecessidadeCombustivel(); 13 relatorio.gerarTexto(); 14 } 15 } 16 Programação Orientada a Objetos com Java Classes Abstratas: Cenário Código de RelatorioNecessidadeCombustivel: 1 public class RelatorioNecessidadeCombustivel { 2 public void gerarTexto( ) { 3 Companhia c = Companhia.getCompanhia(); 4 Veiculo v; 5 double combustivel; 6 double total_combustivel = 0.0; 7 8 for (int i=0; i < c.getTamanhoFrota(); i++ ) { 9 v = c.getVeiculo(i); 10 11 // Cálcula o combustível necessário para esta viagem 12 combustivel = v.calculaDistanciaViagem() / v.calculaEficienciaCombustivel(); 13 14 System.out.println(" Veículo " + v.getNome() + " necessita de " + combustivel + " litros de combustível."); 16 total_combustivel += combustivel; 17 } 18 output.println("Total de combustível necessário é " + total_combustivel + " litros."); 19 } 20 } 17 Programação Orientada a Objetos com Java Classes Abstratas: Solução • Uma classe abstrata modela uma classe de objetos onde a implementação não é conhecida, mas é implementada por subclasses concretas. 18 Programação Orientada a Objetos com Java Classes Abstratas: Solução 1 public abstract class Veiculo { 2 public abstract double calculaEficienciaCombustivel(); 3 public abstract double calculaDistanciaViagem(); 4} 1 public class Caminhao extends Veiculo { 2 public Caminhao(double cargaMaxima) {...} 3 4 public double calculaEficienciaCombustivel() { 5 /* Cálculo do consumo de combustível do caminhão para uma dada carga */ 6 } 7 public double calculaDistanciaViagem() { 8 /* Cálculo da distância desta viagem */ 9 } 10 } 1 public class Balsa extends Veiculo { 2 public Balsa(double cargaMaxiam) {...} 3 4 public double calculaEficienciaCombustivel() { 5 /* Cálculo a eficiência do combustível de uma balsa */ 6 } 7 public double calculaDistanciaViagem() { 8 /* Cálculo a distância desta viagem rio a fora */ 9 }} 19 Programação Orientada a Objetos com Java Interfaces • Uma interface pública é um contrato entre o código cliente e a classe que implementa a interface. • uma Interface Java é uma declaração formal deste contrato no qual os métodos não contém implementação. • Diversas classes não relacionadas podem implementar a mesma interface. • Uma classe relacionadas. pode implementar várias interfaces não 20 Programação Orientada a Objetos com Java Interfaces(Cont.) • Sintaxe de uma classe Java: <modificador> class <nome> [extends <superclasse>] [implements <interface>, [<interface>]*] { <declarações>* } 21 Programação Orientada a Objetos com Java Exemplo de Interface public interface Voador { public void decolar(); public void aterrisar(); public void voar(); } public class Aviao implements Voador { public void decolar() { // Acelera até decolar } public void aterrisar() { // Desacelere } public void voar() { // Mantenha os motores em funcionamento } } 22 Programação Orientada a Objetos com Java Exemplo de Interface 23 Programação Orientada a Objetos com Java Exemplo de Interface 24 Programação Orientada a Objetos com Java Exemplo de Interface public class Passaro extends Animal implements Voador { public void decolar() { /* implementação da decolagem */ } public void aterrisar() { /* implementação da aterrisagem */ } public void voar() { /* Implementação do vôo */ } public void construirNinho() { /* Constrói ninho */ } public void porOvos() { /* Põe ovos */ } public void comer() { /* Sobreescrita do método comer */ } } 25 Programação Orientada a Objetos com Java Exemplo de Interface 26 Programação Orientada a Objetos com Java Exemplo de Interface(Cont.) public class Aeroporto { public static void main( String[] args) { Aeroporto guarulhos = new Aeroporto(); Helicoptero helicoptero = new Helicoptero(); Planador planador = new Planador(); // Superman é um singleton Voador s = Superhomem.getSupehomem(); guarulhos.fornecePermissaoAterrisagem(helicoptero); guarulhos.fornecePermissaoAterrisagem(planador); guarulhos.fornecePermissaoAterrisagem(s); } } private void fornecePermissaoAterrisagem(Voador f) { f.aterrisar(); } 27 Programação Orientada a Objetos com Java Exemplo Com Múltiplas Interfaces 28 Programação Orientada a Objetos com Java Exemplo Com Múltiplas Interfaces public class PortoSantos { public static void main(String[] args) { PortoSantos porto = new PortoSantos(); Balsa balsa = new Balsa(); Planador planador = new Planador(); porto.fornecePermissaoAtracar(balsa); porto.fornecePermissaoAtracar(planador); } } private void fornecePermissaoAtracar(Navegador s) { s.atracar(); } 29 Programação Orientada a Objetos com Java Quando Usar Interfaces? • Declaração de métodos que uma ou mais classes devem implementar • Exibir a interface de programação de um objeto sem revelar o conteúdo da classe. • Capturar semelhança entre classes não relacionadas sem a necessidade de um relacionamento de classes. • Simular herança múltipla declarando uma classe que implementa várias interfaces 30 Programação Orientada a Objetos com Java O que é preciso saber de interfaces para a prova SCJP ? Todos os métodos de uma interface são implicitamente public e abstract Você precisa saber que ambas as definições abaixo são idênticas: public abstract interface Rolavel { } public interface Rolavel { } 31 Programação Orientada a Objetos com Java O que é preciso saber de interfaces para a prova SCJP ? • Você precisa saber que todos os métodos de interfaces são public e abstract independente como forem escritos na definição da interface. Assim sendo, todos os métodos abaixo são válidos e idênticos: void rolar(); public void rolar(); abstract void rolar(); public abstract void rolar(); abstract public void rolar(); 32 Programação Orientada a Objetos com Java O que é preciso saber de interfaces para a prova SCJP ? • As declarações abaixo não compilam: final void rolar() // final e abstract nunca podem ser usadas em conjunto static void rolar() // interfaces definem métodos de instância private void rolar() // métodos de uma interface são sempre públicos protected void rolar(); // mesmo que acima 33 Programação Orientada a Objetos com Java O que é preciso saber de interfaces para a prova SCJP ? • Interfaces podem ter constantes, que são sempre public static final • A declaração de uma constante em uma interface com public static e final é opcional e possível em qualquer combinação • Interfaces podem herdar de uma ou mais interfaces • Interfaces não podem herdar de uma classe, ou implementar uma interface ou classe 34 Programação Orientada a Objetos com Java Princípios de Design • Programar para uma Interface e não para uma implementação o Em Java, interface pode ser uma classe abstrata ou uma interface Java. • Favorecer a composição em detrimento da herança • Encapsular o que varia o Base do design pattern Strategy 35 Programação Orientada a Objetos com Java Programar para uma Interface 36 Programação Orientada a Objetos com Java Favorecimento da Composição Sobre a Herança 37 Programação Orientada a Objetos com Java Encapsular o que Varia 38 Programação Orientada a Objetos com Java O Design Pattern “Strategy” “Definir uma família de algoritmos, encapsular cada um e tornás-lo intercambiáveis. Strategy permite que algoritmos mudem independentemente dos clientes que os utilizam.” 39 Programação Orientada a Objetos com Java O Design Pattern “Strategy” 40 Programação Orientada a Objetos com Java Perguntas? 41