dúvida static

52 respostas
rodrigo.bossini

Tenho o seguinte código:

class Teste{
  private static final Object o = new Object();
}

class Main{

 public static void main (String ...args){
    new Teste();
    new Teste();
 }
}

O objeto “o” é uma variável de classe, por ser marcada com static. Isso quer dizer que o compilador traduz a linha

private static final Object o = new Object();

para

private static final Object o;

static{
  o= new Object();
}

É isso?

Porque se não for isso, a cada instanciação de objetos da classe Teste o construtor irá rodar e fazer com que a referência “o” aponte para um novo objeto, o que não seria permitido, já que “o” é marcado com final.

Como é que funciona isso?

52 Respostas

rogelgarcia

É isso mesmo… como o ‘o’ é static… só é instanciado uma vez

davidtiagoconceicao

Atributos com o modificador static não são atributos de objeto, são atributos de classe. Portanto, todas as instâncias da classe Teste apontarão para a mesma instância do objeto.
Mais do que isso, não é necessário sequer haver uma instância de Teste para que o objeto o exista, ele pode ser obtido diretamente da classe (Teste.o, desconsiderando os modificadores de permissão).

rodrigo.bossini

davidtiagoconceicao:
Atributos com o modificador static não são atributos de objeto, são atributos de classe. Portanto, todas as instâncias da classe Teste apontarão para a mesma instância do objeto.
Mais do que isso, não é necessário sequer haver uma instância de Teste para que o objeto o exista, ele pode ser obtido diretamente da classe (Teste.o, desconsiderando os modificadores de permissão).

Foi exatamente isso que eu disse. Minha pergunta vai um pouco além - eu perguntei se o compilador transforma o código inicial em um bloco de inicialização estático. Quando for responder em fóruns em geral, é interessante que você o faça com foco na pergunta do autor do tópico, e não simplesmente para mostrar seu conhecimento. Assim você poupa o seu e o meu tempo.

rogelgarcia

Transforma… mas qual a importancia disso? O que importa é a funcionalidade…

E deixa o cara falar… ele nao sabe exatamente em que vc tem duvida… e o que ele respondeu pode ajudar outras pessoas…

davidtiagoconceicao

rod.attack:
davidtiagoconceicao:
Atributos com o modificador static não são atributos de objeto, são atributos de classe. Portanto, todas as instâncias da classe Teste apontarão para a mesma instância do objeto.
Mais do que isso, não é necessário sequer haver uma instância de Teste para que o objeto o exista, ele pode ser obtido diretamente da classe (Teste.o, desconsiderando os modificadores de permissão).

Foi exatamente isso que eu disse. Minha pergunta vai um pouco além - eu perguntei se o compilador transforma o código inicial em um bloco de inicialização estático. Quando for responder em fóruns em geral, é interessante que você o faça com foco na pergunta do autor do tópico, e não simplesmente para mostrar seu conhecimento. Assim você poupa o seu e o meu tempo.

Ok cara.
Obrigado pela dica e desculpa por tentar ajudar.

rodrigo.bossini

rogelgarcia:
Transforma… mas qual a importancia disso? O que importa é a funcionalidade…

Você afirma que ele transforma. Logo deve saber a importância e implicações desta afirmação. Aliás, você poderia me indicar a fonte de onde extraiu esta informação?

rodrigo.bossini

davidtiagoconceicao:
rod.attack:
davidtiagoconceicao:
Atributos com o modificador static não são atributos de objeto, são atributos de classe. Portanto, todas as instâncias da classe Teste apontarão para a mesma instância do objeto.
Mais do que isso, não é necessário sequer haver uma instância de Teste para que o objeto o exista, ele pode ser obtido diretamente da classe (Teste.o, desconsiderando os modificadores de permissão).

Foi exatamente isso que eu disse. Minha pergunta vai um pouco além - eu perguntei se o compilador transforma o código inicial em um bloco de inicialização estático. Quando for responder em fóruns em geral, é interessante que você o faça com foco na pergunta do autor do tópico, e não simplesmente para mostrar seu conhecimento. Assim você poupa o seu e o meu tempo.

Ok cara.
Obrigado pela dica e desculpa por tentar ajudar.

Ler atentamente o que escrevi antes de disparar qualquer coisa que vem à cabeça é o primeiro requisito para considerar que, de fato, você “tentou ajudar”.

rogelgarcia

Isso não acontece…

Da minha cabeça :smiley:

Mas fique tranquilo… que só um objeto será instanciado… o construtor de Teste não influencia em nada nos atributos estaticos…

E como o colega falou… vc nem precisa ter um Teste instanciado para o atributo ‘o’ ser instanciado…

rodrigo.bossini

Isso não acontece…

Da minha cabeça :smiley:

Mas fique tranquilo… que só um objeto será instanciado… o construtor de Teste não influencia em nada nos atributos estaticos…

E como o colega falou… vc nem precisa ter um Teste instanciado para o atributo ‘o’ ser instanciado…

Isto não é uma pergunta sobre quantos objetos serão instanciados. É uma pergunta sobre análise léxica e geração de código. Por isso é importante que se entenda o que perguntei antes de falar qualquer coisa que você sabe sobre o “static”.

Essa resposta não me serve. Você sabe o que é um problema NP-Completo? Seguindo seu racionínio, eu vou agendar minha presença por aí em algum congresso de TI, pra falar que achei a solução para um problema NP-Completo (e por consequencia para todos eles), vou dizer a primeira coisa que eu “tirar da minha cabeça” e falar pra todo mundo ficar tranquilo porque eu sei que é assim. Logo vou ganhar o cobiçado 1 milhão de dólares que está reservado há um bom tempo para o cidadão que conseguir tal proeza. Entendeu agora a importância de falar com convicção, a importância de entender BEM de um assunto antes de falar sobre ele?

rogelgarcia

Cara… a culpa foi sua mesmo… fez uma pergunta totalmente genérica… e entrou na questao de quantos objetos serão instanciados…

Aprender a formular a pergunta também é bom pra gente nao ter que adivinhar o que vc tá querendo…

E vc ainda faz a pergunta em Java Basico…

Vou te dar a dica… leia os bytecodes gerados pelo compilador… assim voce vai saber o que faz… :wink:

rogelgarcia

Mais uma coisa… as ideias e soluções saem da cabeça de alguém viu?!

rogelgarcia

O cidadao que conseguir tal proeza… terá conseguido por alguma informacao que saiu da cabeça dele…

rodrigo.bossini

rogelgarcia:
Cara… a culpa foi sua mesmo… fez uma pergunta totalmente genérica… e entrou na questao de quantos objetos serão instanciados…

Aprender a formular a pergunta também é bom pra gente nao ter que adivinhar o que vc tá querendo…

E vc ainda faz a pergunta em Java Basico…

Vou te dar a dica… leia os bytecodes gerados pelo compilador… assim voce vai saber o que faz… :wink:

Você tem razão. Minha pergunta não está lá tão clara e deveria ter escolhido talvez um outro fórum.

Sim. Neste caso suponho que tenha sido da cabeça de quem criou o analisador léxico, semântico, gerador de código, etc do java, não?

rodrigo.bossini

O cidadao que conseguir tal proeza… terá conseguido por alguma informacao que saiu da cabeça dele…

Ideias brilhantes autênticar são admiráveis.

Adivinhação é diferente disso.

rogelgarcia

Se vc nao aceita alguém ter o conhecimento aqui no forum… nem devia ter perguntado…

Como falei… vai olhar os bytecodes…

davidtiagoconceicao

rod.attack:
davidtiagoconceicao:
rod.attack:
davidtiagoconceicao:
Atributos com o modificador static não são atributos de objeto, são atributos de classe. Portanto, todas as instâncias da classe Teste apontarão para a mesma instância do objeto.
Mais do que isso, não é necessário sequer haver uma instância de Teste para que o objeto o exista, ele pode ser obtido diretamente da classe (Teste.o, desconsiderando os modificadores de permissão).

Foi exatamente isso que eu disse. Minha pergunta vai um pouco além - eu perguntei se o compilador transforma o código inicial em um bloco de inicialização estático. Quando for responder em fóruns em geral, é interessante que você o faça com foco na pergunta do autor do tópico, e não simplesmente para mostrar seu conhecimento. Assim você poupa o seu e o meu tempo.

Ok cara.
Obrigado pela dica e desculpa por tentar ajudar.

Ler atentamente o que escrevi antes de disparar qualquer coisa que vem à cabeça é o primeiro requisito para considerar que, de fato, você “tentou ajudar”.

Cara, eu tenho duas, e apenas duas, coisas a dizer.
Primeira: isto aqui é um fórum aberto, portanto está sujeito a opiniões e respostas que podem fugir da sua intenção. Não é uma empresa de consultoria em que todos estão trabalhando para você.
Segundo: se você vai discordar de todos os posts, pegue um calhamaço de livros e vá procurar respostas por conta própria. Assim você vai economizar o nosso tempo e o seu tempo.

A discussão está encerrada para mim.

rodrigo.bossini

davidtiagoconceicao:
rod.attack:
davidtiagoconceicao:
rod.attack:
davidtiagoconceicao:
Atributos com o modificador static não são atributos de objeto, são atributos de classe. Portanto, todas as instâncias da classe Teste apontarão para a mesma instância do objeto.
Mais do que isso, não é necessário sequer haver uma instância de Teste para que o objeto o exista, ele pode ser obtido diretamente da classe (Teste.o, desconsiderando os modificadores de permissão).

Foi exatamente isso que eu disse. Minha pergunta vai um pouco além - eu perguntei se o compilador transforma o código inicial em um bloco de inicialização estático. Quando for responder em fóruns em geral, é interessante que você o faça com foco na pergunta do autor do tópico, e não simplesmente para mostrar seu conhecimento. Assim você poupa o seu e o meu tempo.

Ok cara.
Obrigado pela dica e desculpa por tentar ajudar.

Ler atentamente o que escrevi antes de disparar qualquer coisa que vem à cabeça é o primeiro requisito para considerar que, de fato, você “tentou ajudar”.

Cara, eu tenho duas, e apenas duas, coisas a dizer.
Primeira: isto aqui é um fórum aberto, portanto está sujeito a opiniões e respostas que podem fugir da sua intenção. Não é uma empresa de consultoria em que todos estão trabalhando para você.
Segundo: se você vai discordar de todos os posts, pegue um calhamaço de livros e vá procurar respostas por conta própria. Assim você vai economizar o nosso tempo e o seu tempo.

A discussão está encerrada para mim.

1- Um fórum aberto não quer dizer um fórum sem qualidade. E eu não disse que você está trabalhando para mim. Não exigi que você me respondesse. Pelo contrário. Pedi que simplesmente cale quando não souber do que está falando. Já pensou como vai ser belo o dia em em que o ser humano deixar de se sentir vaidoso ou em vantagem em relação aos demais por ter adquirido este ou aquele conhecimento? Porque a sua primeira resposta se resumiu a isto - você querendo mostrar todo seu conhecimento sobre o static do java, sem se dar conta que se eu quisesse saber pra que serve o static, teria lido o artigo disponível no GUJ sobre o mesmo. Se tivesse se preocupado em ler o que escrevi (requisito mínimo para se dar ao trabalho de responder) teria simplesmente calado, ou então teria respondido o que perguntei.

2- Pra afirmar que eu discordo de todos os posts você deve ter feito um levantamento estatístico de todos em que participei, não é mesmo?
Ah, e só pra finalizar:
Calhamaço, segundo o Aurélio:
sm (corr de canhamaço) 1 Alfarrábio, cartapácio; livro grande e antigo.

Isso quer dizer então que você está me mandando procurar UM LIVRO GRANDE E ANTIGO DE LIVROS para procurar respostas por conta própria.
Talvez, antes de falar isso, teria sido melhor você mesmo ter procurado um único livro, chamado dicionário, para saber qual o coletivo de livros, antes de citar, simplesmente porque você achou que era isso, “tirou da cabeça”.

A discussão está encerrada por você? Que bom. Pra mim ela nem começou. Espero que continue encerrada para você até que você entenda a minha pergunta, saiba de fato a resposta e então reabra a discussão, a fim de me responder finalmente algo útil.

W

Eu li o problema, achei interessante a questão e ao invés de alimentar esta discussão inútil, fiz o mais fácil :

public class Teste {
private static Teste teste = new Teste("Weber");

Teste(String s) {
System.out.println(s);
}

}

Blocos estáticos são executados mesmo que a classe não contenha o método main (deopis do bloco virá uma exceção claro) e já que a saída do programa acima printa na tela : Weber , por demonstração está provado que o compilador entende a instanciação de uma variável estática como o autor do tópico sugeriu, até que alguém chegue aqui e prove o contrário rs.

W

Faltou dizer que printa na tela, via command line, ou seja : javac Teste.java > java Teste ==> Weber + ExceptionPorNãoTerMetodoMain

rogelgarcia

Eu me contenho para não por fogo nessas discussoes… :smiley: Acho que na vida passada eu fui Nero…

Conflito Nivel 5

http://www.guj.com.br/posts/list/201395.java#1016298

rogelgarcia

Código fonte:

public class Main {
	
	private static final Object object = new Object(); 
}

Se compilarmos esse código e analisarmos os bytecodes que o eclipse mostra em pseudocódigo:

//Compiled from Main.java (version 1.5 : 49.0, super bit)
public class Main {

    //Field descriptor #6 Ljava/lang/Object;
    private static final java.lang.Object object;

    //Method descriptor #8 ()V
    //Stack: 2, Locals: 0
    static {};
        0 new java.lang.Object [3]
        3 dup
        4 invokespecial java.lang.Object() [10]
        7 putstatic Main.object : java.lang.Object [13]
      10 return

    // aqui vem o construtor default que eu omiti pois nao fazia diferença....
    
}

Veremos que todas as instruções para instanciar o object estão dentro do bloco static... comprovando que o compilador transforma o código, condizente com o que eu falei anteriormente. E eu já sabia disso e nao precisava nem perder meu tempo, só que como eu sou muito chato.. resolvi por a prova..

Inclusive essa maneira de comprovar o que eu falei, também tirei da minha cabeça... :D

Não sei se vc consegue enchergar isso rod.. ou se está muito avançado para o seu conhecimento...

W

Com um pequeno teste cheguei a essa mesma conclusão rogelgarcia… mas é interessante essa do Eclipse, como você faz para ver o pseudo código desta maneira?

A do conflito também foi boa hsuahsuahsuas

rogelgarcia

Se voce abrir um arquivo .class no eclipse que nao tenha fonte anexado, ele mostra o pseudo código.

.
.
.

O rod.attack é muito é folgado… o neguinho tá ajudando e ele ainda vem com exigência. Aí dá nivel 5…hehehe
Mas aqui no fórum aparece muito nego tranquilo assim mesmo…

rodrigo.bossini
rogelgarcia:
Código fonte:
public class Main {
	
	private static final Object object = new Object(); 
}

Se compilarmos esse código e analisarmos os bytecodes que o eclipse mostra em pseudocódigo:

//Compiled from Main.java (version 1.5 : 49.0, super bit)
public class Main {

    //Field descriptor #6 Ljava/lang/Object;
    private static final java.lang.Object object;

    //Method descriptor #8 ()V
    //Stack: 2, Locals: 0
    static {};
        0 new java.lang.Object [3]
        3 dup
        4 invokespecial java.lang.Object() [10]
        7 putstatic Main.object : java.lang.Object [13]
      10 return

    // aqui vem o construtor default que eu omiti pois nao fazia diferença....
    
}

Veremos que todas as instruções para instanciar o object estão dentro do bloco static... comprovando que o compilador transforma o código, condizente com o que eu falei anteriormente. E eu já sabia disso e nao precisava nem perder meu tempo, só que como eu sou muito chato.. resolvi por a prova..

Inclusive essa maneira de comprovar o que eu falei, também tirei da minha cabeça... :D

Não sei se vc consegue enchergar isso rod.. ou se está muito avançado para o seu conhecimento...

Me agradeça por ser exigente. Se não fosse por mim você não chegaria até onde chegou. E você não é chato. Chato sou eu. Você é acomodado. Se sentiu ofendido quando seu conhecimento inquestionável foi questionado. Então resolveu correr atráz e sair do marasmo. E não duvide: Haverá (muitas) ocasiões em que você terá plena certeza do que está falando, alguém irá pedir uma prova real, e você acabará por descobrir que estava enganado. Afinal de contas, convenhamos, existem coisas que são "muito avançadas", "até mesmo" pra você, ó mestre.

Como agradecimento, deixo outro ensinamento:

"Enchergar", na verdade, se escreve com X. (No lugar do CH, não vá se confundir).

Viu só como não dá pra confiar em tudo que você "acha que tá certo" e que "tirou da cabeça"?

rogelgarcia

Dureza viu… ainda tenho que escutar isso…

E eu sou acomodado… to vendo isso mesmo…

rodrigo.bossini

rogelgarcia:
Dureza viu… ainda tenho que escutar isso…

E eu sou acomodado… to vendo isso mesmo…

Faltou o obrigado.

glaucogoca

Humildade é uma grande virtude que falta em alguém nessa discussão.

Se pra responderem a pergunta briga desse jeito imagina se tivesse que suportar alguns analistas que eu conheço.

B

Essa mala tinha que ser banida do GUJ… Se vc´s não perceberam esse cara não quer obter conhecimento e sim tumultuar o forum…

Poneis123

esse rod.attack é uma criança arrogante.

pedroroxd

Poneis123:
esse rod.attack é uma criança arrogante.


Arrogante é pouco…

tgmarinho

puts ainda o cara ta queimando o spfc =(

magocebolinha

rod.attack:
Tenho o seguinte código:

class Teste{
  private static final Object o = new Object();
}

class Main{

 public static void main (String ...args){
    new Teste();
    new Teste();
 }
}

O objeto “o” é uma variável de classe, por ser marcada com static. Isso quer dizer que o compilador traduz a linha

private static final Object o = new Object();

para

private static final Object o;

static{
  o= new Object();
}

É isso?

Porque se não for isso, a cada instanciação de objetos da classe Teste o construtor irá rodar e fazer com que a referência “o” aponte para um novo objeto, o que não seria permitido, já que “o” é marcado com final.

Como é que funciona isso?

Dá uma olhada [google] aqui [/google]! :slight_smile:

magocebolinha

rod.attack:
davidtiagoconceicao:
Atributos com o modificador static não são atributos de objeto, são atributos de classe. Portanto, todas as instâncias da classe Teste apontarão para a mesma instância do objeto.
Mais do que isso, não é necessário sequer haver uma instância de Teste para que o objeto o exista, ele pode ser obtido diretamente da classe (Teste.o, desconsiderando os modificadores de permissão).

Foi exatamente isso que eu disse. Minha pergunta vai um pouco além - eu perguntei se o compilador transforma o código inicial em um bloco de inicialização estático. Quando for responder em fóruns em geral, é interessante que você o faça com foco na pergunta do autor do tópico, e não simplesmente para mostrar seu conhecimento. Assim você poupa o seu e o meu tempo.

Nossa cara… num dá pra segurar… vou falar…

Velho… em um tópico fiz uma pergunta plausível e conceitual a respeito de static… e você me mandou ir para o google… você faz essa pergunta inútil e ainda quer passar por cima da galera que tá a mais tempo aqui do que você e diga-se de passagem… que conhece MUITO mais do que você…

Outra coisa… Você diz que deveria ter procurado outro forum, concordo PLENAMENTE contigo… e para mim, esse tipo de argumentação é passível de exclusão.

Aprenda a ser mais humilde.

ah! mais uma vez… como já postei ai em cima… Consulte o google!

até nunca
:evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil:

pedroroxd

HUAhuahu
to rindo d+

ralphsilver

Cara,

vc é babaca hein… se não é o que realmente quer… apenas fala que ainda não chegou no que queria ao invés de dar patata…

o cara pensa que é arrogante e sabichão igual o dr house

pedroroxd

ralphsilver:
Cara,

vc é babaca hein… se não é o que realmente quer… apenas fala que ainda não chegou no que queria ao invés de dar patata…

o cara pensa que é arrogante e sabichão igual o dr house


HUAhuahu
dr house! kkkkkkkkkkkkkk
ri pouco!

magocebolinha

ralphsilver:
Cara,

vc é babaca hein… se não é o que realmente quer… apenas fala que ainda não chegou no que queria ao invés de dar patata…

o cara pensa que é arrogante e sabichão igual o dr house

Dá Vicodin pra ele… uaHauhaUAHua (só ri quem assisti dr house) :twisted: :twisted: :twisted: :twisted: :twisted: :twisted: :twisted: :twisted: :twisted: :twisted: :twisted: :twisted:

Nykolas_Lima

rod, você é muito arrogante.

Falta muita humildade em você.

Se não responderam de acordo com o que você esperava apenas fale que não era o que queria e pronto.

Se você é tão bom quanto diz, porque estava tirando dúvidas aqui?

Tem coisa que não tem como ler e ficar quieto, cara mala de mais.

pedroroxd

(eu + ri)² = eu² + 2xeu*ri + ri²

leidson-JAVA

só pode ser são paulino ¬¬

aff!!!

pedroroxd

leidson-JAVA:
só pode ser são paulino ¬¬

aff!!!


AHUhuahu
bambiii

ralphsilver

ele é babaca… ehhehehe… Vicodin pra ele…

criador

uaaUUAHuhAuhAuhAuhAUHAUHAUH
Muito boa!

Abraço!

javaEd.com

Cada coisa hein, HUMILDADE é uma virtude pouco apreciada hoje em dia . . .

pmlm

É isso e saber quando não ressuscitar tópicos antigos…

xxjamisxx

kkkkkkkkkkkkkkkkkkkkkk
este ae tem um ploblema serio
ele ta brigando por um simples static

pedroroxd

Esse tópico vai pra lista dos + ressuscitados!! kkkk

C

Medo de trabalhar com alguém assim…Cruzes!!

javaEd.com

É isso e saber quando não ressuscitar tópicos antigos…[/quote]

Isso tudo acima e saber também quando não comentar sobre quando alguém ressuscita um tópico antigo . . . ou seja, antes comentar sobre um tópico antigo do que se preocupar com o tempo de resposta de alguém :slight_smile:

É cada um que me aparece . . .

pmlm

[quote=javaEd.com]
Isso tudo acima e saber também quando não comentar sobre quando alguém ressuscita um tópico antigo . . . ou seja, antes comentar sobre um tópico antigo do que se preocupar com o tempo de resposta de alguém :slight_smile:

É cada um que me aparece . . .[/quote]
Não quero entrar em guerras, tanto que tenho mais que fazer. Mas o teu comentário (o outro da humildade) foi completamente despropositado, ao aparecer 6 meses depois…

javaEd.com

pmlm:
[quote=javaEd.com]
Isso tudo acima e saber também quando não comentar sobre quando alguém ressuscita um tópico antigo . . . ou seja, antes comentar sobre um tópico antigo do que se preocupar com o tempo de resposta de alguém :slight_smile:

É cada um que me aparece . . .


Não quero entrar em guerras, tanto que tenho mais que fazer. Mas o teu comentário (o outro da humildade) foi completamente despropositado, ao aparecer 6 meses depois…[/quote]

Não existe guerra e nem quero criar algum tipo de conflito, apenas me senti no direito de comentar sobre tua opinião anterior, já que pelo menos no meu caso quando tenho o que fazer, não fico contando tempo de resposta dos participantes em fóruns, e se caso aparecer algum critério para respodermos ou comentarmos tópicos dentro de um determinado prazo, me limitarei a isso, do contrário apenas expressei uma ideia.

Mas como disse, sem conflitos estamos aqui para aprender, compartilhar ideias, etc . . .

Master.Abs

Hahaha Muito Boa.

Criado 24 de março de 2010
Ultima resposta 12 de jan. de 2011
Respostas 52
Participantes 19