"Vamos passar para um novo tópico. Agora, gostaria de discutir variáveis e métodos estáticos."
"Ellie, já aprendi sobre variáveis e métodos estáticos. Mas gostaria de aprender mais detalhes."
"Quando declaramos variáveis em uma classe, definimos se essas variáveis serão criadas apenas uma vez, ou se cada instância (objeto) da classe terá sua própria cópia. Por padrão, uma nova cópia de uma variável é criada para cada objeto . Isto é o que parece:"
class Cat // Class
{
String name; // Variable
Cat(String name) // Constructor
{
this.name = name; // Variable initialization
}
}
Cat cat1 = new Cat("Oscar"); // Create one object whose name variable contains "Oscar"
Cat cat2 = new Cat("Missy"); // Create one object whose name variable contains "Missy"
System.out.println(cat1.name);
System.out.println(cat2.name);
Oscar
Missy
"Apesar de serem declaradas na mesma classe (Cat), as variáveis cat1.name
e cat2.name
contêm valores diferentes porque referenciam objetos diferentes."
"Isso faz sentido."
"No entanto, existe apenas uma cópia de uma variável estática para cada instância de uma classe e ela deve ser acessada usando o nome da classe."
class Cat // Сlass
{
String name; // Instance (non-static) variable
static int catCount; // Static variable
Cat(String name)
{
this.name = name;
Cat.catCount++; // Increment the static variable by 1
}
}
System.out.println(Cat.catCount);
Cat cat1 = new Cat("Oscar");
System.out.println(Cat.catCount);
Cat cat2 = new Cat("Missy");
System.out.println(cat1.name);
System.out.println(cat2.name);
System.out.println(Cat.catCount);
0
1
Oscar
Missy
2
"OK, isso também faz sentido."
"Os métodos Java são divididos em duas categorias. Os métodos de instância são chamados em um objeto e têm acesso aos dados desse objeto. Os métodos estáticos não têm esse acesso, pois simplesmente não têm uma referência de objeto. variáveis estáticas da classe e outros métodos estáticos.
Métodos estáticos não podem endereçar métodos não estáticos ou variáveis não estáticas!"
"Por que isso, Ellie?"
"Cada variável de instância está contida em um objeto. Ela só pode ser acessada se você tiver uma referência a esse objeto. Essa referência não está disponível para um método estático."
"Os métodos de instância têm essa referência?"
"Sim, ele é passado para métodos de instância indiretamente. Uma referência ao objeto no qual um método de instância é chamado é passada indiretamente para o método de instância. A variável que armazena essa referência é chamada de this . Isso permite que o método sempre acesse o objeto data ou chame outro método não estático no mesmo objeto.
Em vez de uma referência de objeto, null é passado para métodos estáticos. É por isso que eles não podem endereçar variáveis e métodos não estáticos. Eles simplesmente não têm uma referência a um objeto associado a essas variáveis e métodos."
"OK, Ellie, eu entendo isso."
"É assim que os métodos não estáticos funcionam:
Como é o código
|
O que realmente acontece
|
Quando você chama um método usando <object> dot <method name>, na verdade você está chamando um método de classe e passando o mesmo objeto como o primeiro argumento. Dentro do método, o objeto é chamado 'this' . Todas as operações no método são executadas neste objeto e seus dados." |
"Veja como os métodos estáticos funcionam:
Como é o código
|
O que realmente acontece
|
Quando você chama um método estático, nenhum objeto é passado para ele. Em outras palavras, 'this' é igual a null . É por isso que um método estático não pode acessar variáveis e métodos não estáticos (já que não há nada para passar implicitamente para métodos não estáticos)." |
"Uma variável ou método é estático se tiver a palavra-chave static na frente dele."
"Por que esses métodos são necessários se são tão severamente limitados?"
"Bem, esses métodos têm seus benefícios."
"Primeiro, não precisamos passar uma referência de objeto para usar métodos e variáveis estáticos. "
"Em segundo lugar, às vezes é necessário ter uma e apenas uma cópia de uma variável. Por exemplo, System.out (a variável estática out da classe System)."
"Terceiro, às vezes você precisa chamar um método antes de poder criar objetos."
"Ellie, você pode me dar um exemplo disso?"
"Por que você acha que o método main () é estático? Ele é estático, então o programador pode chamá-lo imediatamente após carregar uma classe na memória, antes que qualquer objeto seja criado."
GO TO FULL VERSION