| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 16:31:39
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17539
Offline
|
Como o valor atribuido a um atributo static de uma clase pode manter um valor na memoria ate que a VM seja descarregada, onde esse valor e guardado pra que todas as classes possam ler o valor armazenado e compartilhado?
Resumidamente, o valor atribuído a um atributo static é referenciado pelo objeto do tipo java.lang.Class que representa essa classe. Internamente a JVM cria um objeto java.lang.Class para cada classe carregada (para cada classloader), e que contém uma lista dos atributos static dessa classe.
Então, os métodos podem ler o tal valor armazenado e compartilhado referindo-se a essa classe.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 16:52:54
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
thingol wrote:
A chamada a um método estático de uma classe não envolve instanciar essa classe, apenas carregá-la. Portanto o que você disse está errado. Uma forma de você saber isso é criar um construtor e ver quantas vezes esse construtor é chamado: ele será chamado apenas 1 vez.
Thingol,
Isto de ser chamado 1 vez nao acontece.. fiz ate o exemplo e veja:
OutPut:
ddd
ddd
T
ddd
T
ddd
Cade essa unica vez q vc falou???
This message was edited 4 times. Last update was at 12/01/2009 16:56:57
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 16:56:12
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17539
Offline
|
Se você chamou "new T" uma vez, então o construtor vai ser chamado 1 vez. Se você chamou 2 vezes (como é o seu caso), vai ser chamado 2 vezes. Eu é que não seu contar?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 16:58:44
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
Thingol,
O que vc quiz dizer e que qdo eu uso o new passo pelo construtor, e qdo chamo o metodo static direto nao posso pelo construtor... certo???
Agora me explique, pra eu carregar uma classe eu nao preciso instanciala internamente? Nao entendo como posso carregar algo sem automaticamente instanciar, vejo como um processo sequencia... ? Mesmo que o construtor nao seja invocado, instanciar e uma forma de carregar....
Posso pensar que o T.show() e uma outra forma de instanciar uma classe na memoria sem passar por um construtor... tipo, a VM faz uma instancia diferenciada pro static...
Nao acha algo logico isso?
This message was edited 3 times. Last update was at 12/01/2009 17:01:48
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 17:02:33
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17539
Offline
|
Carregar uma classe (ou seja, carregar o código do arquivo .class ou .jar para poder chamar algum de seus métodos) é diferente de instanciar essa classe (ou seja, criar um objeto que pertence a essa classe.)
As palavras são diferentes (carregar X instanciar), porque o que é feito em cada caso é diferente.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 17:14:55
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
Thingol,
Entao podemos dizer que qdo eu faço uma Reflection de uma classe, estou carregando da mesma forma que um static faz?
Se eu pensar neste modelo, sempre que dizer que um Reflection e mais lento do que dar um new, certo?? Teria que dizer que o static e mais lento tb, nao e?
O que vc acha disso?
This message was edited 3 times. Last update was at 12/01/2009 17:16:22
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 17:16:55
|
Mauricio Linhares
Moderador
![[Avatar]](/images/avatar/97af07a14cacba681feacf3012730892.jpg)
Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline
|
joaosiqueira wrote:Thingol,
Entao podemos dizer que qdo eu faço uma Reflection de uma classe, estou carregando da mesma forma que um static faz?
Se eu pensar neste modelo, sempre que dizer que um Reflection e mais lento do que dar um new, certo?? Teria que dizer que o static e mais lento tb, nao e?
O que vc acha disso?
Impressão minha ou esse cara escreve feito o Márcio Duran?
|
Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr
Screencast de Introdução a linguagem Objective-C |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 17:18:34
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
Mauricio Linhares,
Por favor, so responda a minha pegunta! Pois e uma questao de logica de associaçao...
Afinal e educaçao respeitar a opiniao do outros.
abrs
This message was edited 1 time. Last update was at 12/01/2009 17:19:34
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 19:51:46
|
Leonardo3001
GUJ Ranger
Membro desde: 04/07/2007 18:28:58
Mensagens: 975
Offline
|
Peraí,
vc entende o significado de new T().show() abaixo?
Como o pessoal falou, os atributos estáticos pertencem à java.lang.Class. Quando você tem um método estático, mesmo que você dê new, o método não é aplicado ao objeto que vc criou, mas sim à classe da instância.
Então, dizer que existe diferença entre T.show() e new T().show() é absurdo, ambas são exatamente a mesma coisa! A única diferença é que no segundo exemplo, você simplesmente cria uma instância e a joga imediatamente.
Minha impressão é que você não entende muito de orientação a objetos, acredito que você precise dar uma estudada sobre isso.
This message was edited 1 time. Last update was at 12/01/2009 19:52:53
|
Leonardo Veríssimo
-------------------------------------------------
Objectzilla |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/01/2009 06:29:38
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
Ola pessoal,
Uma duvida:
O processo que o modificador static faz nao e a mesma ideia que uma Reflection ?
Sempre que dizemos que um Reflection e mais lento do que dar um new, certo??
Portanto teria que dizer que o static e mais lento tb que fazer uma instanciaçao, nao e?
Qual o opiniao de vcs nisso?
abrs
This message was edited 1 time. Last update was at 13/01/2009 06:30:31
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/01/2009 06:34:10
|
ccaneta
JavaBaby
![[Avatar]](/images/avatar/00a2aa5c43a94f625ebf713cb5bfb091.png)
Membro desde: 26/03/2006 20:30:54
Mensagens: 97
Offline
|
Acho que uma instancia "new" pode gastar mais memoria do que fazer uma chamada static direto.
Mas nao tenho certeza disso, vcs que me corrijam se estiver enganado.
This message was edited 1 time. Last update was at 13/01/2009 06:35:04
|
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/01/2009 09:46:34
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
Ninguem poderia ajudar com a minha dúvida, por favor?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/01/2009 10:34:41
|
MarceloS
JavaTeenager
Membro desde: 02/06/2008 10:31:11
Mensagens: 185
Offline
|
joaosiqueira wrote:Ola pessoal,
Uma duvida:
O processo que o modificador static faz nao e a mesma ideia que uma Reflection ?
Sempre que dizemos que um Reflection e mais lento do que dar um new, certo??
Portanto teria que dizer que o static e mais lento tb que fazer uma instanciaçao, nao e?
Qual o opiniao de vcs nisso?
abrs
Não. Não necessariamente. Não.
E sua pergunta já estava respondida pelo post do victorwss.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 13/01/2009 22:48:32
|
victorwss
JWizard
![[Avatar]](/images/avatar/4ab232445f9b21b65dfdf6ea5f27f704.png)
Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline
|
Não confunda carregar uma classe com instanciar uma classe. São coisas bem diferentes.
Carregar uma classe = A JVM lê um arquivo .class e inicialmente vê apenas um monte de bytes. Então ela lê estes bytes e monta a estrutura da classe (com os métodos, atributos e todas as instruções que há nos métodos). Toda esta estrutura é carregada internamente na JVM e pode ser parcialmente acessada por meio da classe java.lang.Class. Sempre que uma classe é carregada, a JVM cria um objeto do tipo java.lang.Class para representá-la. Imediatamente após isto ser feito, a JVM inicializa os valores dos atributos estáticos bem como os blocos de inicialização de classe (na verdade toda esta inicialização nos bytecodes aparece como um método chamado "<clinit>".
Instanciar uma classe = A JVM aloca uma área de memória do tamanho necessário para a instância e a limpa (para evitar problemas com memória não-inicializada, comuns em C e C++). Por estar limpa significa que todos os atributos terão o valor inicial false para campos boolean, 0 para os demais primitivos e null para campos de tipo objeto. Em seguida a JVM coloca na primeira parte desta área alocada o ponteiro para o objeto Class correspondente (que é aquilo que o método getClass() retorna) e após isto, o construtor é invocado como se fosse um método void.
Para a classe ser instanciada, ela precisa ser primeiramente carregada.
Sempre que a JVM vê que uma classe precisa ser carregada, ela a carrega automaticamente sem que você peça isso. Se na inicialização da classe uma exceção for lançada, um ExceptionInInitializerError é lançado. Isso é um Error porque em geral a hora em que uma classe é inicializada costuma ser pouco previsível ou controlável. E se a classe não pôde ser inicializada corretamente, então fatalmente ela não poderá ser usada adequadamente.
This message was edited 1 time. Last update was at 13/01/2009 22:50:22
|
Victor Williams Stafusa da Silva
Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.
Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.
Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.
É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
Se você escreve "concerteza", "concerteza" você andou matando aulas de português. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/01/2009 05:38:34
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
victorwss,
Muito boa boa sua explicaçao, gostei mesmo.
Mas nesse momento nao teriamos que concordar com o ccaneta?
Quando diz que o fato de usar uma classe carregada usaria menos memoria e evitaria o tempo de instanciar uma classe, ao contrario do new em que temos que carregar e depois instanciar?
Pensando assim usar um static seria mais vantajoso?
Eu penso logicamente que 1 passo e sempre mais rapido que 2 passos, agora nao sei a opiniao de voces em relaçao a isso..
O que vcs opinam?
This message was edited 3 times. Last update was at 14/01/2009 05:46:33
|
|
|
 |
|
|