variável, memória e processador

Olá a todos! Sou novo no forum e no Java… (e também não sei se minha dúvida tem sentido)

Há alguma diferença para a memória (e processador) se, em vez de usar uma variável de tipo primitivo, eu criar um objeto só para isso?
(supondo que ambas seriam usadas e destruídas no mesmo intervalo de tempo)

Em outras palavras, quando eu uso uma variável de tipo primitivo, a JVM cria um objeto para ela?

Abraços,
júlio

Olá!

As variáveis de tipo primitivo não são objetos em Java. Por isso mesmo você não vê um código assim:

int x = new int();
Repare nas letras minúsculas!

Além disso, se você declara uma variável do tipo primitivo e não a inicializa, o compilador atribui a ela um valor padrão, que é 0 para as variáveis numérias e false para o boolean.

Porém, existe um conceito em Java que são as classes wrapper (envelope, “que envolve”). Elas existem justamente para “transformar em objetos” os tipos primitivos. As classes wrapper SÃO objetos, e há uma classe dessas para cada tipo primitivo. Você as reconhecerá porque são o nome por extenso do tipo primitivo com a letra inicial maiúscula.

São elas: Integer, Boolean, Double, Float, Character, Byte, Short e Long.

Essas você “dá um new”:

Integer x = new Integer(12);

E cuidado! Como as classes wrapper são objetos, caso você não as inicialize, o compilador não irá atribuir um valor. Elas serão NULL e, se você tentar acessá-las, levará um belo NullPointerException na cara.

valeu tiago!

não tinha ouvido falar das wrapper

mas agora veio outra dúvida!

eu sabia que as variáveis primitivas, para o programador, não são objetos. O que eu estava tentando perguntar é como a JVM as trata, isso é, se ela cria objetos para tais variáveis e, com a sua resposta, a duvida agora fica a seguinte:

  • quando eu uso uma variável primitiva será que a JVM trabalha com ela instanciando uma wrapper do tipo respectivo?

  • tem alguma diferença, para a memória (ou processador), usar uma variável primitiva ou instanciar um objeto wrapper do tipo respectivo?

abraços…
Júlio

Nao cara… os Objetos Java vao para o Heap, que eh a memoria da VM propriamente dita, eh um lugar onde a VM sabe que podera achar teu objeto… Ja as variaveis residem na Pilha de chamadas e ficam no escopo enquanto teu metodo ou objeto estiverem no escopo…

Espero ter sido claro…

Abs :wink:

Da uma olhada nesse topico… essa dicursao vai te ajudar http://www.guj.com.br/posts/list/67553.java

Cara, valeu!

esclareceu mesmo o tópico que vc indicou!

então - só para ver se não entendi errado - é mais interessante de um ponto de vista da performance do meu software (e também no tempo do desenvolvimento!), sempre que der, utilizar uma variável primitiva, e não criar um objeto só pra guardar tal valor.

certo?

por exemplo, se minha classe possui um campo x do tipo int, não tem sentido nenhum eu, em vez de declarar esse campo x como primitivo, transformar esse próprio campo x numa instância de um objeto do tipo Integer (wrapper).

perderei tempo no desenvolvimento e na performance.

é isso mesmo?

Abraços,
Júlio

[quote=jcacustodio]então - só para ver se não entendi errado - é mais interessante de um ponto de vista da performance do meu software (e também no tempo do desenvolvimento!), sempre que der, utilizar uma variável primitiva, e não criar um objeto só pra guardar tal valor.

certo?[/quote]

Não necessariamente, Julio. Por não serem objetos, os tipos primitivos, por exemplo, não são passíveis de coleta de lixo; ou seja, mesmo que você deixe de usar uma variável do tipo primitivo no seu programa, ela nunca vai deixar de ocupar algum espaço de memória. Isso nunca é bom pro desempenho…

Além do mais, a JVM é excelente em regular seu próprio desempenho, com recursos como compilação JIT, os “hot spots” da JVM da Sun etc.

E por fim, na minha opinião, o uso dos tipos primitivos rompe com a orientação a objetos, a linguagem vira um “monstro do Frankenstein” com elementos OO e outros não. Com as classes wrapper, o Java vira uma lingagem totalmente OO.

Tanto é que faz muito, mas MUITO tempo que eu, no meu trabalho de desenvolvedor, vejo um int ou um double. É sempre Integer e Double.

É justamente o contrário: você GANHA em tempo e desempenho usando wrappers, pois seu programa fica inteiramente OO.

[quote=thiagobaptista][quote=jcacustodio]então - só para ver se não entendi errado - é mais interessante de um ponto de vista da performance do meu software (e também no tempo do desenvolvimento!), sempre que der, utilizar uma variável primitiva, e não criar um objeto só pra guardar tal valor.

certo?[/quote]

Não necessariamente, Julio. Por não serem objetos, os tipos primitivos, por exemplo, não são passíveis de coleta de lixo; ou seja, mesmo que você deixe de usar uma variável do tipo primitivo no seu programa, ela nunca vai deixar de ocupar algum espaço de memória. Isso nunca é bom pro desempenho…

Além do mais, a JVM é excelente em regular seu próprio desempenho, com recursos como compilação JIT, os “hot spots” da JVM da Sun etc.

E por fim, na minha opinião, o uso dos tipos primitivos rompe com a orientação a objetos, a linguagem vira um “monstro do Frankenstein” com elementos OO e outros não. Com as classes wrapper, o Java vira uma lingagem totalmente OO.

Tanto é que faz muito, mas MUITO tempo que eu, no meu trabalho de desenvolvedor, vejo um int ou um double. É sempre Integer e Double.

É justamente o contrário: você GANHA em tempo e desempenho usando wrappers, pois seu programa fica inteiramente OO.[/quote]

fechou… Faz tempo que nao vejo um int tbm… soh Integer, Long e BigDecimal…

Abs 8)

UFA! Isso foi mesmo esclarecedor…

Já estava até tentando re-entender tudo que estava aprendendo sobre orientação a objeto!

Quando comecei estudar, meu primeiro pensamento foi: “é isso, pra que variável se eu posso controlar tudo?”

Mas tem um tanto de livros, artigos e, principalmente, professores de Java e OO que só sabem confundir as coisas…

Vocês tiraram um peso da minha consciência! Valeu mesmo…

Abraços…