Inicialização e Finalização de
Objetos
Inicialização e Finalização de Objetos
A inicialização automática de variáveis em Java
se dá de duas formas:
Variáveis locais a métodos
Variáveis de instância ou de classe
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
A inicialização automática de variáveis em
Java se dá de duas formas:
Variáveis locais a métodos
nenhuma inicialização automática é realizada. O compilador checa se as variáveis foram
inicializadas antes do seu uso
Inicialização e Finalização de Objetos
A inicialização automática de variáveis em Java
se dá de duas formas:
Variáveis de instância ou de classe
tipos numéricos e caractere são inicializados com zeros (caso o caractere seja impresso a saída será um
espaço), tipo booleano é inicializado com false e referências são inicializadas com null.
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Inicialização de atributos de Instância
Existem dois lugares onde os atributos de instância podem ser inicializados: dentro do construtor ou na declaração do atributo. No exemplo 1 é
demonstrado estes dois tipos de inicialização. O atributo a é inicializado na declaração e o
Inicialização e Finalização de Objetos
Inicialização de atributos de Instância Exemplo 1
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Inicialização de atributos de Instância
Qual é a diferença entre os dois tipos de inicialização?
A primeira diferença é que os construtores são parametrizados e, portanto, a
inicialização com construtor pode variar conforme os parâmetros passados.
A segunda diferença é que a inicialização no construtor é feita após a inicialização na declaração.
Inicialização e Finalização de Objetos
Inicialização de atributos de classe
A inicialização das variáveis de classe não pode ocorrer dentro dos construtores, uma vez que o construtor pertence ao objeto e não à classe. Outra diferença é que a inicialização só ocorre uma vez, já que existe apenas uma versão
atributo. A inicialização ocorre quando o primeiro objeto é criado.
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Blocos de inicialização
Java permite que as inicializações de atributos, tanto de classe como de instâncias de classe sejam
agrupadas em blocos. No exemplo 2 pode-se observar o uso de blocos de inicialização
{ ….
}
Inicialização e Finalização de Objetos
Blocos de inicialização
Exemplo 2
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Ordem de inicialização
Como já foi dito a inicialização na
declaração é feita antes da
inicialização no construtor.
E no caso da herança? O que é
inicializado primeiro? A classe ou a
superclasse?
Inicialização e Finalização de Objetos
Ordem de inicialização
Nesse caso a super classe é inicializada primeiro. Mesmo que não ocorra uma invocação explícita ao construtor da superclasse é chamado o construtor default. No exemplo 3 é mostrado a seqüência de inicialização em uma herança.
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Inicialização e Finalização de Objetos
Ordem de inicialização - Exemplo 3
Saída:
X foi inicializada! Y foi inicializada!
Inicialização e Finalização de Objetos
Finalização de Objetos
Com a linguagem Java não existe a preocupação de liberar a memória, como é o caso de C/C++, uma vez que os objetos que não estão sendo
referenciados são coletados automaticamente pelo coletor de lixo (GC).
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Finalização de Objetos
No entanto, em Java pode-se invocar uma função
de C/C++ por meio de uma chamada nativa, e
como esta função pode alocar memória que não
será devolvida pelo coletor de lixo, então pode
ser necessária alguma forma de devolver
explicitamente esta memória quando o objeto for
coletado. Para esses casos a programador deve
prover o método
finalize(),
que será invocado
quando o objeto for coletado.
Inicialização e Finalização de Objetos
Finalização de Objetos
O método
finalize()
não é para ser chamado explicitamente. Ele é invocado pela máquinavirtual antes de devolver a memória usada pelo objeto. Nele o programador deve devolver a
memória alocada por métodos nativos e associada ao objeto
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Alocação e liberação de memória
A criação de um objeto geralmente envolve
–Alocação de memória no heap para conter o objeto –Atribuição do ponteiro (endereço no heap onde o
espaço para o objeto foi alocado) a uma variável de pilha (referência)
Inicialização e Finalização de Objetos
Alocação e liberação de memória
Objetos podem ser criados explicitamente
de duas formas:
–através de uma expressão new Classe()
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Apenas
objetos String
podem ser
criados implicitamente
Através da definição de um literal ou carga de uma classe que possui literais do tipo String
Inicialização e Finalização de Objetos
Quando uma nova instância de uma classe é
criada
Memória é alocada para todas as variáveis de instância declaradas na classe e superclasses, inclusive variáveis ocultas.
–Não havendo espaço suficiente para alocar
memória para o objeto, a criação termina com um OutOfMemoryError
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Se a alocação de memória terminar com
sucesso
Todas as variáveis de instância do novo objeto (inclusive aquelas declaradas nas superclasses) são inicializadas a seus valores default(0, null, false, ‘\u0000’)
No passo seguinte, os valores passados como
argumentos do construtor passados às
variáveis de parâmetro locais e a construção é
iniciada
Inicialização e Finalização de Objetos
Finalizaçãoé importante?
Depende.
Há objetos que não precisam de finalizadores
Aqueles cujos recursos são automaticamente liberados pelo coletor de lixo: qualquer tipo de alocação na
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Finalizaçãoé importante?
Há objetos que precisam de finalizadores
Fechar arquivos abertos e sockets(o sistema operacional limita a quantidade de recursos que são abertos; não finalizar depois do uso pode impedir a criação de novos arquivos ou sockets)
Fechar streams (fluxos de gravação podem ficar incompletos se buffer não for esvaziado)
Fechar threads(threads costumam rodar em loops; finalizadores ligam um flag para terminar o loop ou interrompem o thread e evitar que o programa nunca termine)
Inicialização e Finalização de Objetos
Finalizadores automáticos
Em Java, cada objeto pode ter um finalizador
chamado automaticamente antes de um objeto ser destruído
Para implementar, é preciso sobrepor a assinatura:
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Finalizadores automáticos
finalize()é chamado automaticamente e apenas uma vez somente quando o objeto não for mais alcançável a través de referências comuns (raiz) O método finalize()não será chamado se
Não sobrepuser explicitamente o método original (uso é opcional!)
Não houver necessidade de liberar memória (GC não executar), mesmo que todas as referências do objeto tenham sido perdidas
Inicialização e Finalização de Objetos
Finalizadores automáticos
A chamada dos finalizadores automáticos não é garantida
Inicialização e Finalização de Objetos
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Inicialização e Finalização de Objetos
REVISANDO.
Os Atributos em Programação Orientada a Objetos são os elementos que definem a estrutura de uma classe. Os atributos também são conhecidos como variáveis de classe, e podem ser divididos em dois tipos básicos:
atributos de instância e de classe. Os valores dos atributos de instância determinam o estado de cada objeto. Um atributo de classe possui um estado que é compartilhado por todos os objetos de uma classe. Atributos de classe podem ser chamados também de atributos estáticos ou constantes.
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
Sockets
Um socket é um mecanismo de comunicação
(dois sentidos) entre dois programas a
Inicialização e Finalização de Objetos
ALBERTO WILLIAN MASCARENNHAS http://sites.google.com/site/awmascarenhas/ awmascarenhas@gmail.com
CRÉDITOS
JAVA NA PRÁTICA
Volume I
Alcione de Paiva Oliveira Vinícius Valente Maciel
UNIVERSIDADE FEDERAL DE VIÇOSA DEPARTAMENTO DE INFORMÁTICA
Inicialização e Finalização de Objetos
CRÉDITOS
Gerência de Memória em Java Parte III:
Finalização, memory leakse objetos de referência