Pode ser que nao entendi ou a traducao esta errada,se alguem me explicar vou agradecer
segue:
O acesso a campos estaticos deve ser feito a partir de metodos static synchronized.O acesso a campos nao estatico
de ver ser feito a partir de metodos que nao sejam static synchronized.Por exemplo:
pag 406 Capitolo 9
public class Thing{
private static int staticField;
public static synchronized void setStaticField(int staticField){
Thing.staticField=staticField;
}
}
me parece que contradiz em cheio o que esta acim
help!!
[quote=pardal_nb]membros STATIC’s somente podem acessar membros STATIC’s, porém, membros não STATIC’s podem acessar membros STATIC’s…
compreendeu?!
membors = propriedades e métodos[/quote]
opa,beleza mas…
aqui abaixo da certo
public class NewClass{
static int y; // menbro estatico
public synchronized void x(int u){//menbro nao estatico
NewClass.y=u;
}
public static void main(String[] args){//sem erro de compilacao
new NewClass().x(10);
}
}
Apesar de só agora ter caido a fixa,mas entao pq isso da certo ?
[quote=nbluis][quote=pardal_nb]membros STATIC’s somente podem acessar membros STATIC’s, porém, membros não STATIC’s podem acessar membros STATIC’s…
compreendeu?!
membors = propriedades e métodos[/quote]
Da classe corrente diretamente…
Nada impede de um método/bloco estático fazer instanciação de objetos sem trabalhar estaticamente…[/quote]
bloco nao eh método da classe…
como o próprio nome diz, BLOCO DE INICIALIZAÇÃO…serve para inicializar usas propriedades…pode ver, q antes mesmo do seu construtor ser executado, ou seja, antes do seu objeto, de fato, existir no HEAP é executado o bloco static…e uma única vez…
Rolou uma confusão de conceitos aí. Bem, vamos tentar resolver a situação:
Definições:
atributos e métodos estáticos são métodos da classe, isto é, vc não precisa instanciar um objeto para utilizá-los. Mas não tem problema se vc acessá-los a partir de um objeto, embora isso não seja uma prática recomendável.
atributos e métodos não estáticos são atributos e métodos do objeto, isto é, vc DEVE OBRIGATORIAMENTE instanciar um objeto para utilizá-los. Se vc tentar acessá-los a partir da classe dá erro!
public class MyClass {
public int x ; // atributo de objeto
public static int y; // atributo de classe
}
....
MyClass.x = 10; // ERRO!
MyClass.y = 10; // OK
new MyClass().x = 10; // OK
O mesmo vale pros métodos, mas alguns cuidados extra devem ser tomados. Vejamos:
public class MyClass {
private int x ; // atributo de objeto
public static int getX() {
return x;
}
}
...
MyClass.getX(); // ERRO!
O que há de errado com o código acima? Simples, o método getX() é estático então ele poderia ser chamado sem instanciar objeto, MAS acontece que ele tá acessando um atributo de objeto e, portanto, uma incongruência! Isso nos leva a regra 1.
Regra 1: métodos estáticos devem acessar atributos membros estáticos.
Solução: torne “x” estático ou então faça o método “getX()” não estático, vai depender da tua necessidade.
E o código agora?
public class MyClass {
private static int x = 20; // atributo de classe
public int getX() {
return x;
}
}
Este código não apresenta problema, pois um método não estático pode acessar atributos estáticos, embora neste caso o ideal é fazer “getX()” ser um método estático tb.
Por fim, temos o synchronized. Este modificador só deve ser utilizado quando várias threads podem acessar simultâneamente o método. Desta forma o sychronized é utilizado para serializar o acesso as threads. Se o método estático não for acessado simultaneamente por várias threads então não compensa utilizar o synchronized sob pena de fazer o desempenho da aplicação cair bastante!