Criação e remoção de objetos

Programação 3: Orientação a Objetos e Java


Ao invés de inicializar atributos de tipo classe com null como feito anteriormente, normalmente é mais interessante criar objetos e usá-los para inicializar os atributos. De uma forma geral, a criação de um array que pode armazenar n elementos de uma classe Classe é especificado pela seguinte expressão:

new Classe[n]
Por exemplo, um array de contas pode ser criado como descrito a seguir:
  Banco (byte tamanho) {
    contas = new Conta[tamanho];
    indice = 0;
  }
onde o número de elementos que podem ser armazenados no array é dado como argumento para o construtor de bancos.

A criação de objetos de classes em geral é especificada por expressões da seguinte forma:

new Classe(argumentos)
onde argumentos é uma lista de argumentos de acordo com um dos construtores da classe. Por exemplo, executando o código a seguir
    Banco	b1;
    Conta	c1, c2, c3;

    c1 = new Conta(100.00,12345);
    c3 = new Conta(85.00,10);
    b1 = new Banco(30);
cria-se e inicializa-se duas contas e um banco, de acordo com os argumentos especificados e os respectivos construtores de Conta e Banco.

É importante lembrar que tanto atributos quanto variáveis de tipo classe estão associadas a nomes de objetos, ao invés de objetos propriamente ditos. Assim, a expressão

new Conta(100.00,12345)
devolve o nome da conta criada, ao invés da conta propriamente dita. Da mesma forma, a variável c1 armazena simplesmente o nome do objeto criado. Por conseqüência, executando-se a atribuição
    c2 = c1;
apenas armazena-se em c2 o mesmo nome de objeto armazenado em c1; atribuição não leva a criação de um novo objeto! De fato, executando-se
    c2.print_saldo();
    c1.print_saldo();
pode-se verificar que o saldo da mesma conta será impresso duas vezes.

Como vimos acima, objetos podem ser criados dinamicamente mediante o uso do comando new. Também sabemos que os nomes (referências) dos objetos são armazenados em variáveis ou associadas a atributos. Quando o nome de um objeto deixa de estar armazenado em uma variável ou associado a algum atributo, o sistema de garbage collection de Java automaticamente destrói o objeto. Em Java, não é necessário (nem possível) destruir explicitamente um objeto.

No entanto, podemos especificar que determinadas operações devem ser executadas antes da destruição de qualquer objeto de uma dada classe. Para isso, basta definir o método finalize:

void finalize() {
  ...
}
que não tem parâmetros nem devolve resultados. Este método é particularmente útil quando o objeto a ser destruído mantém alguns recursos que não podem ser liberados pelo garbage collector de Java. Por exemplo, removendo um objeto que estava usando recursos do sistema operacional implica no bloqueio desses recursos até que o sistema deixe de funcionar.


Paulo Borba (phmb@di.ufpe.br)