INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2...
Transcript of INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2...
21/08/2012
1
INF1636 – PROGRAMAÇÃO ORIENTADA A
OBJETOS
Departamento de Informática – PUC-Rio
Ivan Mathias [email protected]
Programa – Capítulo 3
• Ponteiros e Variáveis de Objeto
• Construtores e Blocos de Inicialização
• Exercício
• Envio de Mensagens em Java
• Variáveis e Métodos Estáticos
2© LES/PUC-Rio
21/08/2012
2
Programa – Capítulo 3
• Ponteiros e Variáveis de Objeto
• Construtores e Blocos de Inicialização
• Exercício
• Envio de Mensagens em Java
• Variáveis e Métodos Estáticos
3© LES/PUC-Rio
Ponteiros
• Um ponteiro é tipo de dados cujo domínio é composto porendereços de memória e o valor null;
• O valor null não é um endereço de memória válido;• Ele indica que, no momento, o ponteiro não pode ser
usado para referenciar nenhuma célula de memória.
4© LES/PUC-Rio
21/08/2012
3
Ponteiros em Java (1)
• A linguagem Java não possui ponteiros para tiposprimitivos;
• Para manipularmos objetos em Java precisamos declararvariáveis de objetos;
• Uma variável de objeto é uma referência para umobjeto;
5© LES/PUC-Rio
Ponteiros em Java (2)
• Enquanto um ponteiro em C++ referencia uma área dememória, uma referência em Java referencia instânciasde classes;
• Como conseqüência, não podemos realizar operaçõesaritméticas sobre referências em Java.
6© LES/PUC-Rio
21/08/2012
4
Criação de objetos
• A simples declaração de uma variável de objeto não ésuficiente para a criação de um objeto.
// v não referencia nenhum objeto// o valor inicial de v é null
Vetor v;
• A criação de um objeto deve ser explicitamente feitaatravés do operador new (palavra reservada de Java).
7© LES/PUC-Rio
// criação de um objeto
v=new Vetor();
Alocação de objetos
• O operador new aloca o objeto na área dinâmica dememória (heap) e retorna uma referência para o mesmo;
• A referência é então atribuída à variável de objeto v• A referência é então atribuída à variável de objeto v.
8© LES/PUC-Rio
21/08/2012
5
Atribuição de variáveis de objeto
• Como as variáveis de objeto são referências, as operaçõesde atribuição entre elas não criam novos objetos.
Vetor v1,v2,v3;
v1=new Vetor();v2=v1;
• Após a execução da atribuição v2=v1, ambas as variáveisirão referenciar o mesmo objeto.
9© LES/PUC-Rio
Inicialização de variáveis de instância
• É uma boa prática de programação inicializar as variáveisde instância de uma classe;
• Caso isso não seja feito o compilador Java irá atribuir• Caso isso não seja feito, o compilador Java irá atribuirvalores default para as variáveis não inicializadasexplicitamente. Isso será feito da seguinte maneira:
– Variáveis numéricas (byte, int, double e etc.) serão inicializadas com o valor zero;
– Variáveis do tipo char serão inicializadas com \u0000;
10© LES/PUC-Rio
– Variáveis do tipo boolean serão inicializadas com false;
– Variáveis de objeto serão inicializadas com null.
21/08/2012
6
Programa – Capítulo 3
• Ponteiros e Variáveis de Objeto
• Construtores e Blocos de Inicialização
• Exercício
• Envio de Mensagens em Java
• Variáveis e Métodos Estáticos
11© LES/PUC-Rio
Construtores
• Um construtor é um método especial que é executadotodas as vezes que um objeto é criado;
• Ele é normalmente usado para fins de inicialização;• Ele é normalmente usado para fins de inicialização;
• Características de um construtor:
– O nome de um construtor deve ser igual ao nome da classe onde ele será definido;
– Um construtor possui zero ou mais parâmetros;
12© LES/PUC-Rio
– A chamada de um construtor é feita exclusivamente através do operador new;
– Um construtor não retorna nenhum valor, embora seja incorreto usar o tipo void para indicar este fato.
21/08/2012
7
Exemplo de construtor
public class Contribuinte{private String nome;private String endereco;private String endereco;private String dtNasc;private long cpf;
public Contribuinte() // construtor{nome="João da Silva";dtNasc="01/01/1900";
}
13© LES/PUC-Rio
public String getCpf(){// o código não é relevante
}}
Sobrecarga de método
• Sobrecarregar (overloading) um método significa definirvários métodos com o mesmo nome, mas com diferentesparâmetros.
public class Teste{public void umMetodo(){
// código irrelevante}public int umMetodo(int x){
14© LES/PUC-Rio
{return 2;
}public void umMetodo(String y,char z){
// código irrelevante}
}
21/08/2012
8
Sobrecarga de construtor
• Como qualquer outro método, o construtor também podeser sobrecarregado;
• Caso nenhum construtor seja definido o compilador Java• Caso nenhum construtor seja definido, o compilador Javafornece um construtor default para a classe;
• O construtor default não possui parâmetros;
• Embora um construtor default possa ser inseridoimplicitamente pelo compilador Java, podemos defini-loexplicitamente.
15© LES/PUC-Rio
explicitamente.
Construtor default - Exemplo
public class Contribuinte{private String nome;private String endereco;p g ;private String dtNasc;private long cpf;
public Contribuinte() // construtor default{nome="João da Silva";dtNasc="01/01/1900";
}
16© LES/PUC-Rio
public String getCpf(){// o código não é relevante
}}
21/08/2012
9
Omissão do construtor default
• Caso um construtor diferente do default seja definido, ocompilador Java não irá fornecer implicitamente umconstrutor default;
• Nesse caso, a invocação do construtor default, através dooperador new, irá causar um erro de compilação.
public class Contribuinte{public Contribuinte(String n){
nome=n;
17© LES/PUC-Rio
nome=n;}
}
...{Contribuinte c=new Contribuinte(); // erro}
Blocos de inicialização
• Um bloco inicialização é um bloco de código não-nomeadodefinido no escopo de uma classe;
• Uma classe pode ter vários blocos de inicialização;• Os blocos de inicialização são executados sempre que um
objeto da classe na qual eles foram definidos é criado.
public class Contribuinte{// variáveis
public Contribuinte()
18© LES/PUC-Rio
p (){
nome="João da Silva";dtNasc="01/01/1900";
}{
cpf=0;}
}
21/08/2012
10
Seqüência de eventos na criação de objetos
• Podemos observar a seguinte seqüência de eventos apósa criação de um objeto:
– Todas as variáveis de instância são inicializadas, na ordem em que foram declaradas;
– Todos os blocos de inicialização são executados, na ordem em que foram definidos;
19© LES/PUC-Rio
– O construtor invocado pelo operador new é executado.
Programa – Capítulo 3
• Ponteiros e Variáveis de Objeto
• Construtores e Blocos de Inicialização
• Exercício
• Envio de Mensagens em Java
• Variáveis e Métodos Estáticos
20© LES/PUC-Rio
21/08/2012
11
Programa – Capítulo 3
• Ponteiros e Variáveis de Objeto
• Construtores e Blocos de Inicialização
• Exercício
• Envio de Mensagens em Java
• Variáveis e Métodos Estáticos
21© LES/PUC-Rio
Envio de mensagens em Java
• Objetos distintos ocupam áreas de memória distintas.
22© LES/PUC-Rio
• Logo, ao enviarmos uma mensagem para um objetodevemos fazê-lo através de uma referência para omesmo;
• Em Java, isso é feito através de uma variável de objeto.
21/08/2012
12
Execução do Comando i=v1.modulo()
v1.modulo()
23© LES/PUC-Rio
Conseqüências
• Para enviarmos mensagens para um objeto precisamosmanter uma referência para o mesmo;
• A necessidade mantermos referências para os objetosnos obriga a trafegar referências nas trocas demensagens (parâmetros);
• Caso não haja pelo menos uma referência para um objetoele se torna inacessível;
• Em Java, não é responsabilidade do programadordesalocar as áreas de memória que não serão mais
24© LES/PUC-Rio
usadas;• Uma thread que roda em background, chamado Garbage
Collector, reclama as áreas de memórias não-referenciadas e as devolve para a área de memória livredo heap.
21/08/2012
13
Programa – Capítulo 3
• Ponteiros e Variáveis de Objeto
• Construtores e Blocos de Inicialização
• Exercício
• Envio de Mensagens em Java
• Variáveis e Métodos Estáticos
25© LES/PUC-Rio
Variáveis estáticas
• Em algumas situações gostaríamos que um grupo deobjetos de uma mesma classe pudesse ter acesso a umaárea de memória compartilhada;
• Como exemplo poderíamos citar a situação onde osobjetos de uma classe tivessem que estar a par donúmero de objetos instanciados a partir da mesma;
• Nesse caso, cada objeto instanciado deveria somar umaunidade a uma variável que guardaria o número de
26© LES/PUC-Rio
unidade a uma variável que guardaria o número deobjetos instanciados até o momento;
• A linguagem Java oferece tal possibilidade através dasvariáveis estáticas.
21/08/2012
14
Variáveis estáticas – Exemplo (1)
• Uma variável estática pertence à classe, e não aos objetosda classe;
• Existe apenas uma instância de uma variável estática,independentemente do números de objetos instanciados.
public class Empregado{private int id;private double salario;private static int numEmp=0; // variável estática
public Empregado()
27© LES/PUC-Rio
{numEmp++; //incrementa o número de empregados criados
}public int getNumEmp(){return numEmp;}
}
Variáveis estáticas – Exemplo (2)
public class Ex07 {public static void main(String[] args)p ( g[] g ){
Empregado e1,e2,e3;
e1=new Empregado();System.out.println(e1.getNumEmp());
e2=new Empregado();System.out.println(e2.getNumEmp());
O valor 1 será exibido
O valor 2 será exibido
O valor 3 será exibido
28© LES/PUC-Rio
e3=new Empregado();System.out.println(e3.getNumEmp());
}}
O valor 3 será exibido
21/08/2012
15
Variáveis estáticas - Ilustração
29© LES/PUC-Rio
Métodos estáticos
• Um método estático, ou método de classe, é uma métodoque pertence à classe;
• Um método estático não pode manipular variáveis de• Um método estático não pode manipular variáveis deinstância, apenas as variáveis estáticas;
• A especificação da linguagem Java diz que “um método declasse é sempre invocado sem referência para um objetoparticular”;
• Dessa forma, um método de classe é invocado através do
30© LES/PUC-Rio
Dessa forma, um método de classe é invocado através donome da classe.
a=Math.sqrt(Math.pow(x,2.0)+Math.pow(y,2.0));
21/08/2012
16
Referência this
• Todo objeto mantém uma referência para si mesmo;
• Esta referência é feita pela palavra reservada this.
public Contribuinte() // construtor{this.nome="João da Silva";this.dtNasc="01/01/1900";
}
• No exemplo acima o uso da referência this é
31© LES/PUC-Rio
• No exemplo acima, o uso da referência this édesnecessário, pois sempre que enviamos umamensagem para um objeto temos que fazê-lo através deuma referência para o mesmo.
Referência this – Exemplo (1)
• O uso da referência this é fundamental quandodesejamos passar o próprio objeto como argumento emuma troca de mensagem.
public class Empregado{public void alocaGerente(Projeto p){
p.registraGerente(this);}
}
public class Projeto
32© LES/PUC-Rio
{Empregado gerente;
public void registraGerente(Empregado e){
gerente=e;}
}
21/08/2012
17
Referência this – Exemplo (2)
public class Ex05{public static void main(String[] args){
Projeto p=new Projeto();
Um novo projeto e um novo empregado são criados
j p j ();Empregado e=new Empregado();
e.alocaGerente(p);}
}
A mensagem alocaGerente é enviada para o empregado (e) passando o projeto (p) como argumento
public class Empregado{
33© LES/PUC-Rio
public void alocaGerente(Projeto p){
p.registraGerente(this);}
}O empregado envia a mensagem registraGerente para o projeto (p) passando ele próprio (this) como argumento
Referência this – Exemplo (3)
public class Projeto{Empregado gerente;
O projeto registra o empregado recebido como parâmetro (e) como gerente do projeto
Empregado gerente;
public void registraGerente(Empregado e){
gerente=e;}
}
34© LES/PUC-Rio
21/08/2012
18
Referência this – Exemplo (4)
• Podemos usar a referência this para invocar umconstrutor a partir de outro construtor da mesma classe.
public class Vetor{// variaveisprivate double x=3.0;private double y=4.0;
// métodospublic Vetor(double a,double b){x=a;
O construtor default chama o
35© LES/PUC-Rio
y=b;}
public Vetor(){this(0.0,0.0);
}}
O construtor default chama o construtor Vetor(double, double)passado o ponto (0.0,0.0) como argumento