O que ocorre quando faço:" new MinhaClasse()" sem variável de referência?

5 respostas
N

bom dia
tenho o seguinte código

mapaComandos = new HashMap<String, InterfaceCommand>();
mapaComandos.put(“separacaoQuantidade”, new SeparacaoQuantidade(new ConferenciaDAO(pool), new SeparacaoDAO(pool)));

minha dúvida é…
o que ocorre quando eu instancio uma classe sem atribuir a instância a uma variável de referência?
como no caso acima?
obrigado

5 Respostas

altitdb

Você apenas cria um Objeto!

Mais não pode acessa-lo por não ter uma referencia dele.

Se tem como acessar sem ter referencia eu não sei.

xD~~

E

Nesse caso em particular, o objeto é criado através de seu construtor (via new ConferenciaDAO(pool)) e a sua referência é transferida para o parâmetro, que é de certo modo uma variável de referência também.

Mas se você tivesse algo solto, assim:

new ConferenciaDAO(pool);

o que ocorreria é que o construtor seria chamado, construindo o objeto e executando as operações especificadas no construtor.
Uma vez que o objeto, depois de retornar do construtor, provavelmente não tem mais referências a ele, então o objeto estaria disponivel para limpeza do lixo.
(tudo depende do construtor, é claro! Pode ser que esse construtor fizesse uma cópia da referência para uma lista de objetos acessada por um singleton, por exemplo. Nesse caso o objeto ainda não estaria disponível)

N

entendi perfeitamente, no meu caso acho que o código apenas está passando uma referência de uma classe de conexão através da variável pool, muito obrigado.

discorpio

Bom dia a todos.

Existe um conceito que precisa ser mais debatido quanto a instancição de objetos em memória, e este conceito seria esclarecido com a pergunta a seguir:

O que é armazenado dentro da variável de um objeto a qual chamamos de instância :?:

Muitos desenvolvedores, inclusive eu logo no início do meu aprendizado, acreditavam e ainda acreditam que é o Objeto em si que é armazenado em memória, quando na verdade é simplesmente o enderêço de memória de onde o Objeto foi alocado, e não o Objeto.

Por esta razão chamamos a variável de referência da instância, onde a sintaxe “new” primeiramente aloca o Objeto em memória e faz um mapeamento da mesma e armazena o enderêço deste mapeamento na variável.

Na Linguagem Pascal Object do Delphi, existia um problema constante de se destruir (limpar) da memória um Objeto sem limpar a sua referência (variável) em memória, problemas este que foram sanados mais tarde, com o método do Pascal “FreeAndNil”.

Por esta razão, é que desenvolveram o Garbage Colector, que faz o compilador java verificar se um objeto em memória esteja lactente (sem ser acessado) por muito tempo, e o destroi da memória, verificando os objetos orfãos de referência, limpando-as logo a seguir. Este tema está mais sucinto neste link: http://www.guj.com.br/article.show.logic?id=28

Com relação as [color=darkblue]“Classes Anônimas”[/color], ou seja, voce alocar o Objeto desta forma:

new MinhaClasse();

Estas não possuem referência, e por esta razão fica inascecível ao desenvolvedor, o que ocorre neste momento e que a sintaxe “new” cria uma alocação dinâmica fazendo com que a classe seja uma subclasse da classe que o invocou, exemplo de quando compilado fica [color=darkblue]ClassePrincipal$1.class[/color], assim o JVM pode invocar seu construtor e criar o Objeto, além do qual também executar os seus listeners de eventos que porventura esteja configurados em componentes do Objeto instanciado, e é por isso que tais classes são consideradas Anônimas.

Aliás chamá-las de classes anônimas seria um tanto quanto incoerente, só porque ficou anônima na compilação, pois afinal, a me ver, a classe foi identificada, como no caso acima, MinhaClasse, o que ficou anônimo mesmo foi a instância ou variável pelo qual não se tem a referência de memória específica para ela, ficando este referência agregada a classe que a invocou.

discorpio

Olá, sou eu de novo.

Quero fazer uma correção a tempo do meu post anterior.

Onde se lê no texto destacado em azul:

Leia-se:

Tal correção se fez necessária, pois SubClasse é um conceito de herança, o que realmente não se aplica no caso acima.

Criado 14 de julho de 2010
Ultima resposta 14 de jul. de 2010
Respostas 5
Participantes 4