1. Métodos estáticos

Além das variáveis ​​estáticas, as classes também podem ter métodos estáticos.

Métodos regulares são vinculados a objetos (instâncias) de uma classe e podem se referir a variáveis ​​comuns (não estáticas) da classe (bem como variáveis ​​e métodos estáticos ). Os métodos estáticos são vinculados ao objeto estático da classe e só podem acessar as variáveis ​​estáticas e/ou outros métodos estáticos da classe.

Para chamar um método comum (não estático) em uma classe, você deve primeiro criar um objeto da classe e depois chamar o método no objeto. Você não pode chamar um método comum na classe em vez de um objeto.

Exemplo:

Você não pode chamar um método não estático em uma classe!
public class DataInfo
{
   public int getValue()
   {
      return 100;
   }
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.getValue()); // This will generate an error!
   }
}

Mas para chamar um método estático, basta que o objeto estático da classe simplesmente exista (e sempre existirá depois que a classe for carregada na memória). É por isso que o método main() é estático. Ele está vinculado ao objeto estático da classe, portanto, você não precisa criar nenhum objeto para chamá-lo.

Para declarar um método estático, você precisa escrever a palavra-chave static antes do cabeçalho do método. A aparência geral desta construção é a seguinte:

static Type name(parameters)
{
   method code
}

Exemplos:

Código Observação
public class Solution
{
   public static void main(String args[])
   {
      test();
   }

   public static void test()
   {
      int d = 2/0;
   }
}


A máquina Java chama o mainmétodo com um comando como este: Solution.main();



O método estático test()é chamado no main()método estático.

Para chamar um método estático de outra classe, você precisa especificar o nome da classe antes do nome do método estático. A aparência geral desta construção é a seguinte:

Type name = ClassName.methodName(arguments)

Exemplos:

Código método estático
int x = Math.min(a, b);
int min(int a, int b)
Thread.sleep(200);
void sleep(long ms)
Path path = Path.of("c:\\readme.txt");
Path of(String str)


2. Métodos estáticos x comuns (não estáticos)

Qual é a diferença entre métodos estáticos e métodos comuns?

Um método comum está vinculado a um objeto comum (uma instância de uma classe), enquanto um método estático não está. Um método comum pode acessar variáveis ​​em sua instância, mas um método estático não pode: ele simplesmente não tem uma instância associada.

As diferenças entre os dois tipos de métodos são expressas na tabela a seguir:

Habilidade/propriedade método comum método estático
Vinculado a uma instância da classe Sim Não
Pode chamar métodos comuns da classe Sim Não
Pode chamar métodos estáticos da classe Sim Sim
Pode acessar variáveis ​​comuns da classe Sim Não
Pode acessar variáveis ​​estáticas da classe Sim Sim
Pode ser chamado em um objeto Sim Sim
Pode ser chamado na aula Não Sim

Por que tais métodos são necessários se são tão severamente limitados? A resposta é que essa abordagem também tem suas vantagens.

Primeiro, você não precisa passar nenhuma referência de objeto para acessar métodos e variáveis ​​estáticos.

Em segundo lugar, às vezes você precisa que haja apenas uma única instância de uma variável. Por exemplo, System.out( a variável static out da classe System ).

E, terceiro, às vezes você precisa chamar um método antes mesmo de ser possível criar objetos. Por exemplo, a máquina Java chama o método main() para iniciar a execução do programa antes mesmo de uma instância da classe ser criada.

Vinculado a uma instância da classe

Quando um método comum é chamado, um argumento — o objeto no qual o método é chamado — é passado implicitamente para ele. Este parâmetro é chamado this. Esse parâmetro implícito (uma referência ao objeto no qual o método é chamado) distingue os métodos comuns dos estáticos.

Os métodos estáticos não têm esse parâmetro implícito, portanto, você não pode usar a thispalavra-chave dentro de métodos estáticos e não pode chamar um método não estático dentro de um método estático. Simplesmente não há nenhum lugar para obter uma referência a uma instância de uma classe.

Pode chamar métodos comuns da classe

Um método comum sempre tem o parâmetro implícito this, então você sempre tem uma referência ao objeto no qual o método é chamado. Sempre que você chama um método comum dentro de outro método comum, o thisparâmetro implícito é usado para fazer essa chamada. Exemplo

Código Como funciona
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = min(a, b);
   return min(t, c);
}
int min(int a, int b)
{
   return a < b ? a : b;
}

int min(int a, int b, int c)
{
   int t = this.min(a, b);
   return this.min(t, c);
}

É por isso que você não pode chamar um método comum de um estático. Simplesmente não há variável implícita nomeada thisdentro de um método estático.

Ou imagine outra situação: nem um único objeto de nossa classe foi criado em nosso programa. Podemos chamar um método estático da nossa classe? Sim. E esse método estático pode chamar um método comum (não estático)?

Bem, em que objeto o chamaríamos? Afinal, ainda não existe uma única instância da nossa classe!

Pode chamar métodos estáticos da classe

Os métodos estáticos podem ser chamados de qualquer lugar — de qualquer lugar do programa. Isso significa que eles podem ser chamados de métodos estáticos e comuns. Não há restrições aqui.

Pode acessar variáveis ​​comuns da classe

Você pode acessar variáveis ​​comuns de uma classe a partir de um método comum, pois pode facilmente obter uma referência a uma instância da classe por meio do thisparâmetro implícito.

Um método estático não sabe qual instância da classe deve usar para obter valores de variáveis ​​comuns. E, de maneira mais geral, podemos facilmente ter uma situação em que um método estático é chamado, mas nem uma única instância da classe foi criada no programa.

Como resultado, métodos estáticos não podem acessar variáveis ​​comuns de uma classe.

Suponha que um método estático chame um método comum. Em qual objeto esse método comum deve ser chamado?

métodos estáticos

Ninguém sabe! É por isso que você não pode chamar um método comum de um estático sem passar uma referência a um objeto!

Pode acessar variáveis ​​estáticas da classe

A situação com chamadas para variáveis ​​estáticas é a mesma que com chamadas para métodos estáticos. As variáveis ​​estáticas podem ser acessadas de qualquer lugar no programa. Isso significa que você pode acessá-los a partir de métodos estáticos e comuns.

Pode ser chamado em um objeto

Ambos os métodos estáticos e comuns podem ser chamados em um objeto. Uma chamada de método comum é possível — de fato, essa é a única maneira de chamar um método comum. Um método estático também pode ser chamado em um objeto: neste caso, o próprio compilador determina o tipo da variável e chama o método estático com base em seu tipo:

Código Como o compilador o vê
Thread th = Thread.current();
th.sleep(1000);
Thread th = Thread.current();
Thread.sleep(1000);
Integer i = 1;
int x = i.parseInt("12");
Integer i = 1;
int x = Integer.parseInt("12");
"".valueOf(12);
String.valueOf(12);

Pode ser chamado na aula

Você pode chamar apenas um método estático em uma classe. Para chamar um método comum, você precisa de uma referência a uma instância da classe. Portanto, você não pode chamar um método comum usando esta construção:ClassName.methodName(arguments)