Ponteiros em Java

De Aulas

Afluentes: Estrutura de Dados

Ponteiros

Os ponteiros são variáveis especiais que apontam para uma área de memória. Os ponteiros não possuem a informações em si, mas dizem onde a informação está.

Podemos, em um nível mais alto, fazer um comparativo com páginas web. Quando criamos uma página, adicionamos um conteúdo nela, informações, imagens, etc. Contudo, não podemos colocar tudo numa página só e nem fica bom para se ler, então podemos separar nosso conteúdo por tópicos e para cada um fazemos uma página diferente. Para navegar de uma página a outra, criamos os links. Esses links possuem o endereço web da outra página que queremos acessar e naquela outra página é que está o conteúdo.

Podemos ver os ponteiros, mais ou menos como esses links, ou seja, os ponteiros não possuem a informação, mas o endereço de onde está a informação.

Se você clicar em um link e a página do endereço do link não existir, teremos como resultado um erro 404. Da mesma forma, teremos um erro se tentarmos acessar o conteúdo de um ponteiro que não foi alocado (nulo) ou, no caso do C, um ponteiro selvagem (que aponta para um local qualquer).

Para podermos acessar o conteúdo do ponteiro, precisamos apontar ele para uma área da memória que já existe ou alocar espaço usando new e apontar para essa área recêm criada.

Variáveis versus Ponteiros

As variáveis de um programa, em geral, podem ter dois tipos de conteúdo:

Valor: instâncias de um determinado tipo.

tipo : int       tipo : char       tipo : double
valor:   2       valor:  'z'       valor:  34.12

Referência: indica outra variável na memória. tipo : ref. p/ int[] tipo : ref. p/ string valor: {8, 10} valor: "abcdef"

Variáveis: Valores

Considere a classe Ponto:

public class Ponto {
	double x;
	double y;
}

Atribuir uma variável de valor a outra apenas copia seu conteúdo atual. Uma modificação em uma delas não afeta a outra variável.

Ponto p1, p2;
...
p1.x = 3;
p1.y = 1;
...
p2.x = p1.x;
p2.y = p1.y;
...
p1.x = 5;
Java ponteiros 01.png

Variáveis: Referência

Atribuir uma referência faz com que ambas apontem para o mesmo objeto. Qualquer alteração afeta as duas variáveis.

Ponto p1, p2;
...
p1.x = 3;
p1.y = 1;
...
p2 = p1;
...
p1.x = 5;
Java ponteiros 02.png

Referências em Java

Em java, todos os tipos primitivos são representados por valores.

char c;
int x, y;
c = 'a';
x = y = 3;

Os tipos compostos (classes), por outro lado, utilizam referências.

String s;
Ponto p;
Integer n;
Vector v;

s = "Unisul";
p = new Ponto(3, 1);
p.x = x;
n = new Integer(3);
v = null;

A memória só é requisitada no momento em que o objeto é necessário, evitando o desperdício.

Ponto p = new Ponto(20, 34);

A memória é alocada para o novo objeto e sua posição armazenada em uma referência (ponteiro):

Java ponteiros 03.png


Tplnote Bulbgraph.png

Em C/C++ é preciso desalocar as variáveis antes de eliminar a última referência para ela. Em Java não é necessário, pois o garbage collector libera a memória automaticamente.