class - BCC Unifal-MG

Propaganda
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
Download