INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2...

18
21/08/2012 1 INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOS Departamento de Informática – PUC-Rio Ivan Mathias Filho [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

Transcript of INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2...

Page 1: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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

Page 2: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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

Page 3: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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

Page 4: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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

Page 5: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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.

Page 6: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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.

Page 7: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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}

}

Page 8: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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

}}

Page 9: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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;}

}

Page 10: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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

Page 11: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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.

Page 12: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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.

Page 13: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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.

Page 14: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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

Page 15: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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));

Page 16: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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;}

}

Page 17: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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

Page 18: INF1636 – PROGRAMAÇÃO ORIENTADA A OBJETOSivan/INF1337/Notas Aula/POO-CAP-03.pdf · 21/08/2012 2 Programa – Capítulo 3 • Ponteiros e Variáveis de Objeto • Construtores

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