dúvida static

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?

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

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).

[quote=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).[/quote]

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.

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…

[quote=rod.attack][quote=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).[/quote]

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.[/quote]

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

[quote=rogelgarcia]Transforma… mas qual a importancia disso? O que importa é a funcionalidade…

[/quote]

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?

[quote=davidtiagoconceicao][quote=rod.attack][quote=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).[/quote]

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.[/quote]

Ok cara.
Obrigado pela dica e desculpa por tentar ajudar.[/quote]

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”.

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…

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…[/quote]

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?

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:

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

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

[quote=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:

[/quote]

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?

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

[/quote]

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

Adivinhação é diferente disso.

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

Como falei… vai olhar os bytecodes…

[quote=rod.attack][quote=davidtiagoconceicao][quote=rod.attack][quote=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).[/quote]

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.[/quote]

Ok cara.
Obrigado pela dica e desculpa por tentar ajudar.[/quote]

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”.[/quote]

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.

[quote=davidtiagoconceicao][quote=rod.attack][quote=davidtiagoconceicao][quote=rod.attack][quote=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).[/quote]

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.[/quote]

Ok cara.
Obrigado pela dica e desculpa por tentar ajudar.[/quote]

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”.[/quote]

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.[/quote]

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.

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.

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