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 
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…