"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:"

declaração de classe
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Código no método main :
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);
Saída de tela
Oscar
Missy

"Apesar de serem declaradas na mesma classe (Cat), as variáveis cat1.name​​e cat2.namecontê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."

declaração de 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
    }
}
Código no método main:
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);
Saída da tela:
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
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
O que realmente acontece
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
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
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
O que realmente acontece
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
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."