Novamente duvida livro kathy

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 :cry:
help!!

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=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=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]

isso mesmo!!

membro NAO estático consegue acessar membro ESTATICO …

 public class NewClass{  
              
 static int y;  // menbro estatico  
   
     public synchronized void x(int u){//membro nao estatico  
         NewClass.y=u;  
     }
}  

o contrário, nao eh válido:

 public class NewClass{  
              
     int y;  // membro não estatico  
   
     public static synchronized void x(int u){//membro estatico  
         NewClass.y=u;  
     }  
}

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

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

  2. 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!

[quote=pardal_nb]membro NAO estático consegue acessar membro ESTATICO …

ops desculpas Pardal vc tem razao mesmo!!

[quote=jdefarge][/quote]

boa mas fui eu que fiz confusao no exemplo inicial copiei o exemplo errado
o contra exemplo veio depois
valeu!!jdefarge :oops: