Módulo 07 Características Avançadas de Classes Última Atualização: 15/06/2010 1
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
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
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
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
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
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
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
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
O Design Pattern Singleton 10
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
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
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
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
Constantes: public class Matematica { private static final double PI=3.1213;... // mais declarações Variáveis final 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
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 5 // preenche a companhia com uma frota de veículos 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
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
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
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
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 pode implementar várias interfaces não relacionadas. 20
Interfaces(Cont.) Sintaxe de uma classe Java: <modificador> class <nome> [extends <superclasse>] [implements <interface>, [<interface>]*] { <declarações>* 21
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
Exemplo de Interface 23
Exemplo de Interface 24
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
Exemplo de Interface 26
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
Exemplo Com Múltiplas Interfaces 28
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
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
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
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
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
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
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
Programar para uma Interface 36
Favorecimento da Composição Sobre a Herança 37
Encapsular o que Varia 38
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
O Design Pattern Strategy 40
Perguntas? 41