Estava lendo o Head First Java e dizia que métodos estáticos não se criam objetos e sim se referenciam pela classe como a classe Math da API. Math.random()…
Mas eu estava testando um código e criei um objeto e através do objeto chamei um método estático.E compilo normalmente apenas deu um warning do eclipse dizendo que poderia ter sido acessado de um jeito estático…
Código:
[code]
public class SharpenYourPencil {
int x = 12;
public static void go(final int x){
System.out.println(x);
}
public static void main(String[] args) {
SharpenYourPencil pencil = new SharpenYourPencil();
pencil.go(32);
}
}[/code]
Mas se um método sem argumento ele não compila, já que o método estático não referencia ao campo não estático…
[code]public class SharpenYourPencil {
int x = 12;
public static void go(){
System.out.println(x);
}
public static void main(String[] args) {
SharpenYourPencil pencil = new SharpenYourPencil();
pencil.go();
}
}[/code]
Não é recomendado criar objetos para acessar método estáticos? Por que?
Um método estático só pode acessar atributos estáticos. Esses atributos são compartilhados por todos os objetos de uma mesma classe.
Então, podemos afirmar que fazer isso:
x.metodoEstatico();
Temos uma chance grande de que x esteja alterando um atributo não só para o próprio x, mas todos os objetos que fazem parte da classe de x. O código, portanto, te induz a pensar uma coisa, mas faz outra.
Fica mais claro se você fizer:
ClasseDeX.metodoEstatico();
Afinal, agora você sabe que essa atitude pode afetar toda classe, não só o objeto.
Lembre: Embora possa ser acessado pelo objeto, não é do objeto, é da classe. Então, é melhor deixar isso explicito, fazendo a chamada através da classe.
Sobre métodos estáticos, um exemplo clássico
[code]public class Pessoa
{
private String nome;
private static String sobrenome;
public Pessoa(String nome, String sobrenome)
{
this.nome = nome;
this.sobrenome = sobrenome;
}
public String toString()
{
return nome + " " + sobrenome;
}
public setNome(String nome)
{
this.nome = nome;
}
public setSobrenome(String sobrenome)
{
this.sobrenome = sobrenome;
}
public static void main(String[] args)
{
Pessoa fulano = new Pessoa("Fulano" , "de Tal");
Pessoa ciclano = new Pessoa("Ciclano", "de Tal");
System.out.println(fulano + "\n" + ciclano);
// Imprime:
// Fulano de Tal
// Ciclano de Tal
fulano.setNome("Dom João VI");
ciclano.setNome("Dom Pedro I");
System.out.println(fulano + "\n" + ciclano);
// Imprime:
// Dom João VI de Tal
// Dom Pedro I de Tal
fulano.setSobrenome("de Portugal");
ciclano.setSobrenome("do Brasil");
System.out.println(fulano + "\n" + ciclano);
// Imprime:
// Dom João VI do Brasil
// Dom Pedro I do Brasil
}
}[/code]Reparem no último, mesmo que eu tenha setado sobrenome p/ fulano, o de ciclano é que prevaleceu. Atributos estáticos são compartilhados por todos os objetos de uma mesma classe.