Boa tarde pessoal
Estou inciando em Java e estou com essa dúvida sobre método de classe e de instância, qual a diferença, como implementar e quando usar um ou o outro?
Eu pesquisei na internet mas o que eu li não deu para entender muito bem.
Eu entendi é que método de classe é como se fosse uma função em C, onde tem que passar os parâmetros.
E por instancia o método está no objeto que foi instanciado.
Mas qual a diferença entre os dois?
Como saber quando usar um ou o outro?
[quote=ulfreitas]Boa tarde pessoal
Estou inciando em Java e estou com essa dúvida sobre método de classe e de instância, qual a diferença, como implementar e quando usar um ou o outro?
Eu pesquisei na internet mas o que eu li não deu para entender muito bem.
Eu entendi é que método de classe é como se fosse uma função em C, onde tem que passar os parâmetros.
E por instancia o método está no objeto que foi instanciado.
Mas qual a diferença entre os dois?
Como saber quando usar um ou o outro?
Agradeço a ajuda [/quote]
Atributos e/ou métodos definidos com o modificador static pertencem a classe e não a uma instância (referência a um objeto). Normalmente, isso é possível de ser visto em classes do tipo Util. A classe Collections é um ótimo exemplo disso.
Um momento em que podes usar um método estático é quando tu defini uma classe abstrata, mas deseja que ela ofereça algum método á você. Como sabe, uma classe abstrata não pode ser instanciada, mas pode prover métodos estáticos sem problemas.
Métodos da instância, são métodos que somente serão acessíveis caso tu tenha uma referência para o objeto em questão e isso é feita no momento em que realize um “new”. Exemplo:
ObjetoX x = new ObjetoX();
x.algumMetodo();
O fato de tu exigir um retorno e/ou parâmetros, não influencia em absolutamente nada nesse conceito.
Procure na internet sobre a diferença de Métodos estáticos e Métodos de Instância.
Basicamente
métodos estáticos: são pertencente a classe e acessados pela classe e não pelo objeto ou seja atributos utilizados dentro deste métodos terão que estáticos e são válidos igualmente a todo escopo de sua aplicação para valores utilizados.
métodos de instância: são válidos para aquele objeto instanciado ou seja os valores são privados para aquele objeto e acessados através somente dele.
Uma bola leitura sobre métodos e atributos estático você conseguirá ver a diferença
Sobre quando usar:
Métodos estáticos: Quase nunca. Geralmente são usados para métodos fábrica (que usam o construtor de alguma forma específica para construir objetos da própria classe) ou método utilitários (sendo que nesse caso, deve-se pensar bem se não seria melhor usar um método de instância);
Métodos de instância: Quase sempre.
Sua analogia está certa. Um método estático é como se fosse uma função simples em C, fazendo a classe se comportar como se fosse um “namespace”.
Agora, o método de instância é o seguinte. Imagine que em C você tenha uma Struct qualquer:
Circulo circulo;
circulo.raio = 10;
printf("A area do circulo eh %.2f", area(circulo));
E o uso dessa forma é algo muito comum. Qual foi a idéia então? Que tal se essas funções estivessem na própria struct, e atuassem sobre ela? Te pouparia do trabalho de passar como parâmetro a struct:
typedef struct {
float raio;
float perimetro(); //calcula o perímetro dessa struct
float raio(); //calcula o raio dessa struct
} Circulo;
Exemplo:
Circulo circulo;
circulo.raio = 10;
printf("A area do circulo eh %.2f", circulo.area());
Com objetos é a mesma coisa. Mas isso foi apenas o ponto de partida para um paradigma inteiramente novo. Muda não só a posição das funções, mas a forma de pensar no problema. Com o tempo, você estudará outros recursos, como o polimorfismo, e vai ver que essa aproximação do método e do dado é muito mais poderosa do que parece.
Oi ViniGodoy, descordo de sua colocação do “Quase nunca” para métodos estáticos. Em aplicações que possuem muitas configurações que são comuns a todo escopo da sua aplicação classes com atributos e métodos estáticos é saída mais elegante para tal como exemplo.
Bem, não vou alongar a discussão, mas ainda continuo descordando de sua opinião. Salve pelo fato de que estrutura Singleton usa estático e Registry seria usar uma bazuca para matar uma mosca.
drsmachado
Tem razão, realmente pretendo voltar ao início e estudar com muito mais dedicação.
nel, jonatha.chaves, ViniGodoy
Entao metodo de instancia é criado na classe e para eu acessar esse método tenho que criar uma instancia desse objeto para poder usar ele, entao depois de instanciar é como se o método pertencesse ao novo objeto que eu criei? entao se eu criar 10 novos objetos todos eles vão ter esse método.
exemplo:
public class Veiculo {
private int rodas;
public Veiculo ()
{
this.rodas = 2;
}
public void incrementaRodas()
{
rodas += 2;
System.out.println("numero de rodas " + rodas);
}
}
public class Teste
{
public static void main(String args[])
{
Veiculo carro = new Veiculo();
Veiculo moto = new Veiculo();
carro.incrementarRodas();
}
}
carro teria entao 4 rodas e moto continua com 2.
E metodo de classe utiliza static, entao eu nao posso instanciar ela igual e fiz no exemplo. caso eu use isso como static eu estaria incrementando diretamente na classe Veiculo?
exemplo:
public class Veiculo {
public static int rodas = 2;
public static void incrementaRodas()
{
rodas += 2;
System.out.println("numero de rodas " + rodas);
}
}
public class Teste
{
public static void main(String args[])
{
Veiculo carro = new Veiculo();
Veiculo moto = new Veiculo();
carro.incrementarRodas();
}
e nesse exemplo carro e moto ficariam com 4 rodas?
}
Desculpa se estiver errado mas nao tenho como testar o codigo aqui.
jonatha.chaves
gostei do artigo, acendeu um farol kra, rsrsrsrs obrigado
ViniGodoy
entendi bem com o exemplo em C, bem mais facil fazendo analogia com uma linguagem que agente conhece obrigado mesmo.
[quote=ulfreitas]nel, jonatha.chaves, ViniGodoy
Entao metodo de instancia é criado na classe e para eu acessar esse método tenho que criar uma instancia desse objeto para poder usar ele, entao depois de instanciar é como se o método pertencesse ao novo objeto que eu criei? entao se eu criar 10 novos objetos todos eles vão ter esse método.[/quote]
Isso mesmo. Claro que por baixo dos panos a linguagem não duplica o método (só irá colocar em cada objeto um ponteiro para a classe, e a classe conhece o endereço do método. Depois de compilado, fica lá a chamada do método direto). Mas para o programador, é como se cada objeto tivesse seu próprio método.
Sim, o Singleton usa um método estático que é seu método fábrica (caso que citei se enquadrar nos usos de static ali em cima).
O que falei é que estáticos não são muito comuns. Via de regra, você vai criar é métodos de instância.
A lógica da aplicação dificilmente será implementada através de métodos estáticos.
Esses métodos se aplicam aos casos onde a programação estruturada seria mais adequada do que a OO para resolver um problema (que é o caso que você citou).