Dúvida sobre static, sobre instância

Olá pessoal, bom como quero aprender bem como o java funciona eu semple pesquiso muito, e nas minhas buscas sobre o funcionamento de static me deparei com o artigo: http://www.guj.com.br/article.show.logic?id=121

Até aí tudo bem, mas quando cheguei ao final do artigo há um exemplo:

class Classe2
{
// Escreve alguma frase na tela
public static void escreve(String msg)
{
System.out.println(msg);
}

// Retorna a multiplicação de dois números int   
public static int multiplica(int n1, int n2)   
{   
    return (n1 * n2);   
}   
   
// Construtor, apenas para mostrar que   
// ele nem chega ser chamado   
public Classe2()   
{   
    System.out.println("Construtor de Classe2");   
}   

}

public class TesteStatic2
{
public static void main(String args[])
{
Classe2.escreve(“Multiplicando 3 vezes 3:”);
int resultado = Classe2.multiplica(3, 3);
Classe2.escreve("Resultado: "+ resultado);
}
}

“Rode este programa e repare no resultado. Veja que o construtor da classe não foi chamado, pois não aparece na tela a string “Construtor de Classe2”. Repare também que não criamos instância alguma de Classe2 para chamar seus métodos…”

Fiquei sem intender como é possível ele chamar o método da Classe2 sem instanciar um objeto?, eu até sei que é porque é static, mas fiquei sem intender uma coisa, no caso a linha: “Classe2.escreve(“Multiplicando 3 vezes 3:”);” quer dizer simplesmente que chamei um método da Classe2, que no caso Classe2 ai não é um objeto apenas é uma “ponte” para o metodo da mesma, nada mais ?

Qual seria a real vantagem de fazer dessa forma ao invés de definir o metodo como não static, instanciar o objeto e chamar o metodo pelo objeto criado? se existir algum exemplo que eu possa intender a vantagem disso que por gentileza algume poderia mostra-lo para eu entender melhor.

Obrigado pela atenção de todos, sei que é uma dúvida besta mais fico aqui pensando e pensando bastante sobre isso.

Metodo ou variáveis statics pertencem a classe, logo vc não precisa instanciar um objeto
para poder utiliza-las.
uma vantagem básica : tipo vc quer contar quantas vezes alguém ultilizou a sua classe
só era necessário colocar uma váriável static counter na classe e ele lhe mostraria isso.

Métodos statics são ultilizados principalmente em alguns padrões de projeto
,mas tudo depende so seu projeto para ultilizá-los ou não.

[quote=franciscaetano]Olá pessoal, bom como quero aprender bem como o java funciona eu semple pesquiso muito, e nas minhas buscas sobre o funcionamento de static me deparei com o artigo: http://www.guj.com.br/article.show.logic?id=121

Até aí tudo bem, mas quando cheguei ao final do artigo há um exemplo:

class Classe2
{
// Escreve alguma frase na tela
public static void escreve(String msg)
{
System.out.println(msg);
}

// Retorna a multiplicação de dois números int   
public static int multiplica(int n1, int n2)   
{   
    return (n1 * n2);   
}   
   
// Construtor, apenas para mostrar que   
// ele nem chega ser chamado   
public Classe2()   
{   
    System.out.println("Construtor de Classe2");   
}   

}

public class TesteStatic2
{
public static void main(String args[])
{
Classe2.escreve(“Multiplicando 3 vezes 3:”);
int resultado = Classe2.multiplica(3, 3);
Classe2.escreve("Resultado: "+ resultado);
}
}

“Rode este programa e repare no resultado. Veja que o construtor da classe não foi chamado, pois não aparece na tela a string “Construtor de Classe2”. Repare também que não criamos instância alguma de Classe2 para chamar seus métodos…”

Fiquei sem intender como é possível ele chamar o método da Classe2 sem instanciar um objeto?, eu até sei que é porque é static, mas fiquei sem intender uma coisa, no caso a linha: “Classe2.escreve(“Multiplicando 3 vezes 3:”);” quer dizer simplesmente que chamei um método da Classe2, que no caso Classe2 ai não é um objeto apenas é uma “ponte” para o metodo da mesma, nada mais ?

Qual seria a real vantagem de fazer dessa forma ao invés de definir o metodo como não static, instanciar o objeto e chamar o metodo pelo objeto criado? se existir algum exemplo que eu possa intender a vantagem disso que por gentileza algume poderia mostra-lo para eu entender melhor.

Obrigado pela atenção de todos, sei que é uma dúvida besta mais fico aqui pensando e pensando bastante sobre isso.

[/quote]

Olá, se vc fizer assim:

Classe2 objClasse2 = new Classe2();

objClasse2.escreve("Olá mundo");

no metodo main da classe TesteStatic2 vc vai ver o resultado esperado na tela.

por que ai vc esta criando uma instancia da classe2 e ai o construcor e chamado.

Além do exemplo do jfabbio (de contar a quantidade de instâncias criadas, por exemplo), métodos static são utilizados em padrões como Factory (algumas implementações) e Singleton. No caso de um Singleton o objetivo é garantir que só exista uma instância de uma classe no sistema inteiro. Então é interessante que você mantenha o construtor da classe privado (para ninguém mais instanciá-lo diretamente) e forneça outro meio de instanciar a classe. Um meio que não permita várias instâncias:

class Exemplo {
    private static Exemplo instance;

    private Exemplo() {
        System.out.println("Instanciando novo Exemplo");
    }
    
    public static Exemplo createExemplo() {
        if ( instance == null ) {
            instance = new Exemplo();
        }
        return instance;
    }
}

Esse Singleton aí não é 100%. Tem outros aspectos que tem que ser observado quando há threads no meio, por exemplo.

Mas tome cuidado, o Singleton não é um padrão recomendável atualmente (pelo menos não encha teu sistema de Singletons!). E mais, utilizar métodos estáticos também não é muito recomendável. É mais complicado de testar e eles não podem ser sobrescritos. É melhor pensar duas vezes antes de aplicá-los.

Abraço.

Obrigado pessoal pela ajuda, fiz algums testes aqui , analizando as respostas também estou aprendendo melhor como funciona, obrigado!