Dúvidas Métodos Estáticos

2 respostas
R

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:
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);
	}
}

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

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();
	}
}

Não é recomendado criar objetos para acessar método estáticos? Por que?

2 Respostas

ViniGodoy

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.

B
Sobre métodos estáticos, um exemplo clássico
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
	}
}
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.
Criado 14 de maio de 2008
Ultima resposta 14 de mai. de 2008
Respostas 2
Participantes 3