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! |
---|
|
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 |
---|---|
|
A máquina Java chama o main mé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 |
---|---|
|
|
|
|
|
|
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 this
palavra-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 this
parâmetro implícito é usado para fazer essa chamada. Exemplo
Código | Como funciona |
---|---|
|
|
É 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 this
dentro 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 this
parâ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?
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ê |
---|---|
|
|
|
|
|
|
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)
GO TO FULL VERSION