JAVA - Apostila
532 pág.

JAVA - Apostila


DisciplinaProgramação Orientada A Objetos3.997 materiais58.098 seguidores
Pré-visualização28 páginas
11 de março de 2013 194 / 527
POO \u2013 Conceitos Iniciais
Construtor
Sintaxe:
[visib] nome-da-classe ( < param {, param} > ) { corpo }
Diretrizes
SOMENTE é chamado na criação de um novo objeto
SEMPRE possui o mesmo nome da classe
NÃO possui tipo de retorno
GERALMENTE é público
Observação
Atributos final devem SEMPRE ser inicializado em um
construtor
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 195 / 527
POO \u2013 Conceitos Iniciais
Declaração de construtores na classe Conta
1 public class Conta {
...
3 public Conta(Correntista correntista) {
this( correntista, 0.0 );
5 }
7 public Conta(Correntista correntista, double saldo) {
this.correntista = correntista;
9 this.numero = autoIncremento++;
this.saldo = saldo;
11 }
...
13 }
Observação
A instrução this( correntista, 0.0 ) invoca o outro
construtor passando o correntista e 0.0
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 196 / 527
POO \u2013 Conceitos Iniciais
Declaração de construtores na classe Correntista
public class Correntista {
2 private final long cpf;
private String nome;
4
public Correntista(long cpf, String nome) {
6 this.cpf = cpf;
this.nome = nome;
8 }
10 public long getCpf() {
return this.cpf;
12 }
14 public String getNome() {
return this.nome;
16 }
18 public void setNome( String nome ) {
this.nome = nome;
20 }
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 197 / 527
POO \u2013 Conceitos Iniciais
Criando objetos
Um objeto é a concretização de uma classe
Em outras palavras, é a instanciação de uma classe
O operador new permite que objetos sejam criados a partir
de uma classe. Por exemplo:
String s = new String(&quot;Java é doido demais!&quot;);
Date data = new Date( );
Animal girafa = new Girafa(&quot;Melman&quot;, new Mania(&quot;Doença&quot;));
O operador new aloca memória no heap da JVM e cria a
estrutura básica de um objeto da classe
Bem mais fácil que em C
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 198 / 527
POO \u2013 Conceitos Iniciais
Pergunta-se
Suponha uma classe hipotética X em que não foi definido
nenhum construtor
Como criar um objeto dessa classe?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 199 / 527
POO \u2013 Conceitos Iniciais
Pergunta-se
Suponha uma classe hipotética X em que não foi definido
nenhum construtor
Como criar um objeto dessa classe?
Responde-se
new X()
Pois, como não foi criado nenhum construtor, Java cria um
vazio automaticamente
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 199 / 527
POO \u2013 Conceitos Iniciais
Como criar um objeto da classe Correntista?
A classe Correntista só tem um construtor, logo o único
modo é:
new Correntista( 123, &quot;Ricardo Terra&quot; ) /* valores hipotéticos */
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 200 / 527
POO \u2013 Conceitos Iniciais
Como criar um objeto da classe Conta?
Inicialmente, qualquer construtor da classe Conta requer
um objeto da classe Correntista. Logo:
Correntista c = new Correntista( 123, &quot;Ricardo Terra&quot; )
Assim:
new Conta( c )
new Conta( c, 1000.00 );
Caso não tenha um objeto da classe Correntista, você
pode ser um pouco \u201cousado\u201d:
new Conta( new Correntista( 456, &quot;Maria&quot; ) )
new Conta( new Correntista( 456, &quot;Maria&quot; ), 1000.00 )
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 201 / 527
POO \u2013 Conceitos Iniciais
Métodos Acessores
Na maioria das vezes, opta-se por criar atributos privados e
para modificá-los criam-se métodos acessores (getters e
setters)
Isto faz com que não se tenha acesso direto aos atributos,
mas conseguindo obtê-los e modificá-los
Esses métodos acessores seguem o seguinte padrão:
Método setter se chama setNomeAtributo. Além disso,
retorna void e possui um único parâmetro formal do mesmo
tipo do atributo
Método getter se chama getNomeAtributo. Além disso,
retorna o mesmo tipo do atributo e não possui parâmetro
formal
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 202 / 527
POO \u2013 Conceitos Iniciais
Exemplo \u2013 Métodos Acessores em Correntista
1 public class Correntista {
private final long cpf;
3 private String nome;
5 public Correntista(long cpf, String nome) {
this.cpf = cpf;
7 this.nome = nome;
}
9
public long getCpf() {
11 return this.cpf;
}
13
public String getNome() {
15 return this.nome;
}
17
public void setNome( String nome ) {
19 this.nome = nome;
}
21 }
Pergunta-se
Onde está o setCpf?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 203 / 527
POO \u2013 Conceitos Iniciais
Referência this
this é uma referência ao objeto corrente
É um boa prática, logo deve SEMPRE ser utilizado
Além de boa prática, resolve problema de escopos:
1 public class ExemploThis {
private int x = 2;
3
public void m() {
5 int x = 4;
System.out.printf( &quot;%d&quot;, x );
7 System.out.printf( &quot;%d&quot;, this.x );
}
9 }
Qual a saída?
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 204 / 527
POO \u2013 Conceitos Iniciais
Exemplo Completo
1 public static void main( String[] args ) {
Correntista eu = new Correntista( 123, &quot;Ricardo&quot; );
3 Conta minhaConta = new Conta( eu, 2000 );
5 Conta contaDela = new Conta( new Correntista( 456, &quot;Maria&quot; ) );
7 System.out.printf( &quot;%d %s %.2f\n&quot;, minhaConta.getNumero(),
minhaConta.getCorrentista().getNome(), minhaConta.getSaldo() );
9 System.out.printf( &quot;%d %s %.2f\n&quot;, contaDela.getNumero(),
contaDela.getCorrentista().getNome(), contaDela.getSaldo() );
11
contaDela.depositar( 500.00 );
13
if ( !contaDela.retirar( 600 ) ) {
15 contaDela.retirar( contaDela.getSaldo() );
}
17
minhaConta.transferir( contaDela, 0.5 * minhaConta.getSaldo());
19
System.out.printf( &quot;%d %s %.2f\n&quot;, minhaConta.getNumero(),
21 minhaConta.getCorrentista().getNome(), minhaConta.getSaldo() );
System.out.printf( &quot;%d %s %.2f\n&quot;, contaDela.getNumero(),
23 contaDela.getCorrentista().getNome(), contaDela.getSaldo() );
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 205 / 527
POO \u2013 Conceitos Iniciais
Problemas Comuns (merecem atenção redobrada)
Um atributo final deve ser iniciado uma única vez e deve
ser feito em um construtor
Por isso, é importante utilizar this para chamar um outro
construtor dentro de um construtor
Não se utiliza this para acessar um membro (atributo ou
método) estático (static)
Por exemplo, o atributo estático autoIncremento ou é
utilizado sem this ou Conta.autoIncremento
Um membro estático não pode utilizar this
Como ele não faz parte de nenhum objeto, um membro
estático só pode utilizar membros estáticos
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 206 / 527
POO \u2013 Conceitos Iniciais
Problemas Comuns (merecem atenção redobrada)
Suponha que a classe Pessoa não tenha construtor algum
definido. Para criar um objeto do tipo Pessoa, basta:
new Pessoa()
No entanto, suponha que tenha criado um construtor
dizendo que pessoa deve ter um nome. Então, o único
modo de criar pessoa agora é passando o nome:
new Pessoa( &quot;Ricardo Terra&quot; )
new Pessoa() /* não funciona mais */
Lembre-se, Java só cria o construtor vazio se você não criar
construtor algum
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 207 / 527
POO \u2013 Conceitos Iniciais
Problemas Comuns (merecem atenção redobrada)
E se eu quiser que uma pessoa possa ser criada sem nada
ou com o nome?
1 public class Pessoa {
private String nome;
3
public Pessoa() {
5 }
7 public Pessoa(String nome) {
this.nome = nome;
9 }
11 public String getNome() {
return nome;
13 }
15 public void setNome( String nome ) {
this.nome = nome;
17 }
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 208 / 527
POO \u2013 Conceitos Iniciais
Dicas para evitar problemas
Não crie método