Galera, estava com um problema com o bendito static, resolver ele eu consegui, fui mudando aqui e ali até que parou de dar erro, mas o porque que parou eu nao entendo.
O conceito de static ainda é um pouco vago pra mim(pra nao dizer que nisso estou totalmente perdido), ja li o tutorial da galera aqui do forum, porém as duvidas ainda ficam.
Quando e porque usar o maldito do static? Como acessar algo que é static ou que nao é static?
A parte de singleton eu até entendo, mas nao entendo a sua relação com static e pq todos dizem que eles são relacionados.
Bom, estou precisando dessa luz ai, se alguém puder dar um help, agradeço.
vc pode usar static quando quiser usar um metodo, sem criar uma instancia dele. ou quando quiser por exemplo gerar um id sequencial para um produto. imagine uma linha de produção onde cada produto tenha um id, vc pode ter um atributo static int em uma classe que armazena o valor do id. e toda vez que precisar de um id é só usar essa classe com esse atributo static.
para acessar algo que não é static vc precisa de uma instancia da classe. e para acessar algo que é static, vc não precisa de uma isntancia da classe.
Vc pode calcular o cosseno assim (espero):
Math.cos(noventa);
Mas vc poderia calcular assim:
noventa.cos();
No primeiro exemplo, cos é um método estático da classe Math. Ele não depende de nada (em tese) que não sejam os argumentos passados.
Ja no segundo exemplo, hipoteticamente um Double poderia calcular o cossen de sí proprio, nesse caso, o método deveria consultar o estado do objeto ‘noventa’ e ver qual o seu ‘valor’.
Como o colega acima respondeu, você deve usar atributos estaticos quando quiser usa-los sem ter a necessidade de criar uma nova instância, ou quando você quiser que o valor do atributo seja o mesmo independente de qual instancia você estiver utilizando. Ex:
public class Estaticos {
private Integer naoEstatico = new Integer(10);
private static Integer estatico = new Integer(10);
public static void main(String[] args) {
Estaticos est = new Estaticos();
est.estatico = est.estatico + 1;
est.naoEstatico = est.naoEstatico + 1;
System.out.println("Estatico: " + est.estatico
+ " - Não Estatico: " + est.naoEstatico );
Estaticos est2 = new Estaticos();
est2.estatico = est2.estatico + 1;
est2.naoEstatico = est2.naoEstatico + 1;
System.out.println("Estatico: " + est2.estatico
+ " - Não Estatico: " + est2.naoEstatico );
}
}
O resultado obtido seria:
Estatico: 11 - Não Estatico: 11
Estatico: 12 - Não Estatico: 11
Note que o valor alterado na instância est se propagou para a est2. Apenas lembre-se que sempre que a JVM iniciar a sua aplicação ela carregará todos os atributos estaticos com os valores padrões definidos no código.
Atributos estáticos também são muito usados junto com o modificador final, por exemplo quando nossa classe possui constantes, o Objeto Integer por exemplo possui um atributo static e final que define o valor máximo de uma variavel Integer (Integer.MAX_VALUE)
[quote=sephct]Galera, estava com um problema com o bendito static, resolver ele eu consegui, fui mudando aqui e ali até que parou de dar erro, mas o porque que parou eu nao entendo.
O conceito de static ainda é um pouco vago pra mim(pra nao dizer que nisso estou totalmente perdido), ja li o tutorial da galera aqui do forum, porém as duvidas ainda ficam.
Quando e porque usar o maldito do static? Como acessar algo que é static ou que nao é static?
A parte de singleton eu até entendo, mas nao entendo a sua relação com static e pq todos dizem que eles são relacionados.
[/quote]
Para entender static vc precisa entender o conceito de classe vs objecto.
Classes são difinições só existe uma única classe por classloader com um dado nome.
Essa classe é um dicionário de metadados de objetos. Ela contém toda a estrutura para que o objeto seja criado, mas ela não o cria (que o cria é o classloader). Ora bem, os objetos são criados a partir de um template que é a classe. Eles sempre são associados a uma ,e a uma só, classe. Vc pode saber qual é com o método getClass presente em todos os objetos.
Agora, entenda que a classe em si mesma tb é um objecto. ( do tipo Class)
Se a classe tb é um objeto (embora de um tipo diferente ) eu posso ter métodos nela.
Para destinguir quais métodos são do objeto e quais são da classe utiliza-se o static (estático).
O conceito é que os objetos são criados dinamicamente conforme se vai dando new, mas a classe é imutável (estática)
Portanto, atributos e métodos static pertencem à classe, enquanto os outros petencem ao objeto.
Isso implica em muitas coisas. Por exemplo, o objecto pode acessar tudo o que é da classe, mas a classe não pode acessar o que é do objeto. (escopo diferente) Por isso não pode ser usado ‘this’ em métodos static.
Cuidado com o usos de variáveis static… Quando inicializadas, ficarão alocadas na memória o tempo que o seu sistema estiver rodando… Portanto mantenha as variáveis estáticas, somente as necessárias, pois pode sobrecarregar a memória… e o sistema ficar lento…