[Resolvido]Método no-static x static

5 respostas
Sleipbr

Se instanciarmos 100 objetos todos a partir da classe cachorro que possui o método public latir teremos 100 objetos cada qual com um método latir? E se o método latir for static teremos 100 objetos que usa um único método no espaço que a JVM reservou na memória para a classe?

5 Respostas

ViniGodoy

Mais ou menos.

Métodos, sejam estáticos ou não, pertencem a classe e não ao objeto. O que é individual de cada objeto são as variáveis de classe.
Portanto, a diferença de um método não estático para o estático está apenas no fato do não estático enxergar o this e as variáveis da própria classe.

Sleipbr

ViniGodoy:
Mais ou menos.

Métodos, sejam estáticos ou não, pertencem a classe e não ao objeto. O que é individual de cada objeto são as variáveis de classe.
Portanto, a diferença de um método não estático para o estático está apenas no fato do não estático enxergar o this e as variáveis da própria classe.

Então posso dizer que a JVM reserva um espaço na memória para a classe (com os atributos e métodos públicos e estaticos) e todo o objeto que for criado vai apontar para esse método dando uma ‘falsa’ impressão de que cada objeto tem seu próprio método, quando na verdade só existe um, e com os atributos, ai sim ele vai fazer uma cópia para cada objeto.

E no método static o objeto não vai apontar para o método porque ele é global (ele não pertence ao objeto), portanto só pode ser acessado através da chamada da classe e não do objeto.

Sleipbr
ViniGodoy:
Mais ou menos.

Métodos, sejam estáticos ou não, pertencem a classe e não ao objeto. O que é individual de cada objeto são as variáveis de classe.
Portanto, a diferença de um método não estático para o estático está apenas no fato do não estático enxergar o this e as variáveis da própria classe.

Vini uma dúvida se não-static é também métodos da classe, porque Principal.setQtdOvos(3); não funcionaria?

package iesp;

public class Principal {

	private static int qtdOvos;

	public int getQtdOvos() {
		return qtdOvos;
	}

	public void setQtdOvos(int qtdOvos) {
		Principal.qtdOvos = qtdOvos;
	}
	
}
ViniGodoy

Já sei onde você está confundindo. Muitas pessoas falam que métodos estáticos são “métodos da classe”, enquanto que métodos não estáticos são “do objeto”.
Bem, essa é uma maneira didática de dizer que métodos estáticos não dependem da instância da classe para executar, enquanto os não-estáticos dependem.

Como eu falei no primeiro post, o método não-estático “enxerga o this e as variáveis da própria classe.”
Por isso, o java irá exigir que essa variável esteja presente no momento da invocação.

No mais, é como você falou mesmo. Quando uma classe é carregada na memória, todos os seus métodos também são.
O java apenas cria para você a “ilusão” de que cada objeto tem seu próprio método.

Se um método não-estático for chamado, o código é redirecionado para o método da classe nesse “local global”, mas os dados do objeto são passados junto (por isso a necessidade de ter o objeto na hora da invocação).
Se um método estático for chamado, então, o java irá redirecionar o código para o método, sem passar os dados dos objetos junto.

Sleipbr

Ficou claro! Obrigadooo

Criado 4 de agosto de 2012
Ultima resposta 4 de ago. de 2012
Respostas 5
Participantes 2