Criando instancias sem o new?

9 respostas
vinny767

Pessoal…

Uma dúvida bobinha, mas que está me deixando curioso…
Como é possível criar uma instancia de uma classe sem o operador new?

Por exemplo…

Quando eu digito

Usuario usuario;   --> Estou apenas criando uma referencia usuario para a classe Usuario.

Usuario usuario = new Usuario()  --> Estou invocando o construtor default do Usuario, ou seja, estou criando uma referencia e alocando memoria para o objeto.

 Mas e quando eu digito

 Usuario usuario = (Usuario) paramUser;

Neste caso eu não usei o new e mesmo assim criei uma instancia. Alguem saberia me explicar?

Sds,

Vinicius

9 Respostas

T

Você não criou nada aí - só fez um “cast”.

Em Java só é possível criar novos objetos através de “new” ou então via serialização.

Paulo_Silveira

Nao criou nao. Criou apenas uma outra referencia para o mesmo objeto que paramUser se referenciava (alem de ter trocado a maneira a qual se referenciava ao objeto atraves do casting!

Tem uma estensa explicacao sobre isso na apostila do FJ11, que voce pode baixar aqui (capitulo de OO e referencias):

J

thingol:
Você não criou nada aí - só fez um “cast”.

Em Java só é possível criar novos objetos através de “new” ou então via serialização.

e DI por IOC entraria nessa também?

T

Dependency Injection é feita por algum framework que carrega suas classes e acaba chamando a API de Reflection “newInstance” do objeto Constructor relativo à classe carregada.

Tá bom, tá bom, você não codifica o new, e este não é chamado explicitamente. É que falei assim só para simplificar um pouco. (Quando alguém está aprendendo eu não digo que há 200 jeitos de fazer a mesma coisa, mas só 2 principais, mais para não dar um nó na cabeça de quem está aprendendo.)

sergiotaborda

Sim. Usando Class.newInstance() ou constructor.newInstance(Object … params).

A primeira cria o objeto usando o contrutor sem parametros, mas dá pau se ele não existir ( por isso que os JavaBeans têm que ter um construtor sem parametros). A segunda forma é mais genérica pois é possivel invocar o construtor. Esta é a forma utilizada por injetores. Ele determinam os valores dos parametros do construtor e depois o invocam.

F

Já existe uma instância na memória HEAP da JVM para o objeto Usuario, ou seja, paramUser.

E neste caso:
Usuario usuario = (Usuario) paramUser;

Você está apenas fazendo uma nova referência para o objeto existente, em resumo, não é necessário utilizar o new para um objeto já criado, e apenas referenciá-lo.

Abraços

maior_abandonado

uma outra forma meio esquisita até na minha opinião, foi utilizada na classe Calendar…

a classe Calendar é abstrata, sendo assim não pode ser instanciada… eu queria saber pq q foi criada como abstrata (aproveitando o tópico para essa curiosidade)

tipo… foi criado um metodo getInstance() para retornar uma instancia da classe, ja que ela é abstrata, e não se pode instancia-la… pq q não se cria ela como uma classe comum então?

T

Calendar é abstrata; se você usar getInstance (um método estático), ela lhe retorna uma instância da classe GregorianCalendar. A idéia é que, dependendo da situação, getInstance lhe retornasse outra coisa (por exemplo, em algum outro país ele lhe retornasse uma instância de IslamicCalendar ou BuddhistCalendar ou ImperialJapaneseCalendar ou MayaCalendar ou outra coisa ainda.)

maior_abandonado

dexa eu ver se eu intendi bem… ele retorna uma instancia que tenha os horarios da localidade que conste no SO ?? é isso mesmo???

a duvida eu acho que eu não espressei bem, era por que ter uma classe abstrata que retorne um instancia dela (se for para fazer isso seria mais facil cria-la não abstrata…)

agora devido a questão da localidade eu acho q eu intendi… é isso mesmo q eu intendi?

Criado 30 de junho de 2008
Ultima resposta 1 de jul. de 2008
Respostas 9
Participantes 7