160 likes | 350 Views
Programação Orientada a Objetos*. Construtores e Sobrecarga Prof. Isabel Cafezeiro isabel@dcc.ic.uff.br http://www.dcc.ic.uff.br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC. Construtores. Construtores:
E N D
ProgramaçãoOrientada a Objetos* Construtores e Sobrecarga Prof. Isabel Cafezeiro isabel@dcc.ic.uff.br http://www.dcc.ic.uff.br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC
Construtores Construtores: • são métodos especiais invocados no memento da criação de instâncias; • existe um construtor padrão: não precisa ser programado; • é o primeiro método que um objeto executa: garante a inicialização correta da instância.
Construtores • Exemplo: Data d = new Data(); Data d = new; declaração de referência para a classe Data criação da instância associação da referência à instância invocação do construtor Data() Erro de compilação!!! Criação da instância sem a chamada do construtor C:\>javac demodata1.java demodata1.java:5: <identifier> expected Data hoje = new; ^ 1 error
Construtores Os construtores garantem a inicialização correta da instância Exemplo: Na classe Data, o uso do método inicializaData deveria ser obrigatório: esta tarefa deveria ser efetuada por um construtor.
Construtores • Construtor padrão: inicializa dados da instância com o valor padrão do tipo nativo padrão, ou null (para instâncias de classes) tipo nativovalor padrão booleanfalse char espaço tipos numéricos zero do tipo
Construtores Construtores x outros métodos: • Os construtores têm o nome da classe, respeitando maiúsculas e minúsculas. • Os construtores não retornam valor (nem mesmo void). Devem ser declarados sem retorno. • Não podem ser chamados sem o new.
Construtores Na classe Data: eliminar o método inicializaData, criar inicializações adequadas usando construtores. DataCons.java DataCons(byte d,byte m,short a) { if (dataÉVálida(d,m,a)) { dia = d; mês = m; ano = a; } else { dia = 0; mês = 0; ano = 0; } } // fim do método DataCons
Sobrecarga de métodos A melhor forma de inicializar uma data é ... ¿¿ informando cada componente membro a membro ?? (transparência 7) ¿¿ utilizando uma outra instância de data já criada ?? DataCons.java DataCons(DataCons outraData) { byte d = outraData.dia; byte m = outraData.mês; short a = outraData.ano; if (dataÉVálida(d,m,a)) { dia = d; mês = m; ano = a; } else { { dia = 0; mês = 0; ano = 0; } } // fim do método DataCons
Sobrecarga de métodos Possibilidade de usar o mesmo nome para métodos (com o mesmo propósito) e argumentos diferentes. • Mecanismo já existente em diversas LP’s convencionais; • Mecanismo largamente explorado em POO. Exemplo: DataCons(d,m,a); DataCons(hoje); • mesmo nome, • argumentos diferindo em tipo e/ou quantidade. O método a ser executado é determinado, sem ambiguidade pela seqüência de argumentos !!!
Sobrecarga de métodos DataCons.java public void alteraDia(byte d) { dia = d; System.out.println("Efetuou alteraDia(byte d)"); } // fim do método alteraDia public void alteraDia(int d) { if (d>31) System.out.println("Valor inválido para dia"); else dia = (byte)d; System.out.println("Efetuou alteraDia(int d)"); } // fim do método alteraDia
Sobrecarga de métodos DemoDataCons.java byte b = 4; int i = 4; hoje.alteraDia(b); Efetua alteraDia(byte d) hoje.mostraData(); hoje.alteraDia(i); Efetua alteraDia(int d) hoje.mostraData(); hoje.alteraDia(4); Efetua alteraDia(int d) hoje.mostraData();
Sobrecarga de métodos • Em Java: • O tipo do retorno não pode ser usado para identificar o método; • Sobrecarga se aplica a métodos em geral, e não somente à construtores.
Construtores A invocação de Construtores • Somente construtores podem chamar construtores (outros métodos não podem); • Se um construtor for chamado a partir de outro, esta deve ser a primeira linha de código do chamador; • Construtores são chamados pela palavra reservada this; • Construtores não podem ser recursivos. • A presença de um construtor definido pelo programador impede o uso do construtor padrão da classe, mesmo que o construtor programado tenha assinatura diferente do padrão.
Construtores A invocação de Construtores DataCons(DataCons outraData) { this(outraData.dia,outraData.mês,outraData.ano); } // fim do método DataCons DataCons.java • comparar com o construtor da transparência 8 • verificar que esta chamada invoca o construtor da transparência 7
This (Auto-referência) • Invocar o construtor da classe • Diferenciar os campos do objeto das variáveis locais DataCons(byte dia,byte mês,short ano) { if (dataÉVálida(dia,mês,ano)) { this.dia = dia; this.mês = mês; this.ano = ano; } else { this.dia = 0; this.mês = 0; this.ano = 0; } } // fim do método DataCons variáveis locais com o mesmo nome do que os campos thisdiferencia variáveis locais e campos