Bom dia, estou a dias tentando entender para que serve metodos estaticos e membros estaticos. Sei que quando é estatico, não é objeto e pertence a classe apenas, e quando não é estatico, pertence APENAS aos objetos criados, certo?
Porem, na pratica, para qual caso cada um serviria? Não entra na minha cabeça.
Quando uma variável é declarada na definição da classe, cada instância dessa classe (objeto) obtém uma cópia da mesma, podendo ela ter estado (valor) diferentes entre os objetos. Isso garante que cada objeto seja independente um do outro em termos de estados diferentes, mesmo sendo instâncias de uma mesma classe. Nesse caso, diz-se que a variável é uma variável de instância. No entanto, em certos casos, é interessante que essa variável tenha o mesmo valor (tenha o mesmo estado) para qualquer objeto criado (dentro da mesma JVM/ClassLoader). Nesse caso, a variável é dita variável de classe ou campo. No Java, as variáveis de classe são criadas declarando-as como estáticas.
Como exemplo, indico o problema relatado nesse post: Pq não consigo simplesmente alterar o map em dois métodos diferentes? O problema foi resolvido tornando a variável (no caso do tipo Map
de usuários) estática.
Já os métodos declarados como estáticos permitem que sejam acessados sem a necessidade de se criar uma instância da classe (objeto). Por exemplo:
package dao;
public class Cliente {
public static long inserir(bean.Cliente cliente) throws SQLException {
{...}
}
public static boolean alterar(bean.Cliente cliente) throws SQLException {
{...}
}
public static boolean excluir() throws SQLException {
{...}
}
public static List<Cliente> listar() throws SQLException {
{...}
}
}
permite que se faça:
package view;
public class TelaCliente extends JFrame {
{...}
private void salvar(){
if(clienteValido()){
codigoCliente = dao.Cliente.inserir(retornarCliente());
}
}
{...}
}
Em vez de:
package view;
public class TelaCliente extends JFrame {
{...}
private void salvar(){
if(clienteValido()){
dao.Cliente cliente = new dao.Cliente();
codigoCliente = cliente.inserir(retornarCliente());
}
}
}
Se você prestar atenção, muitos métodos oferecidos pelo Java são estáticos, como, por exemplo, a saída padrão System.out
(System
é a classe e out
é um método estático) e os métodos valueOf
da classe String
.