"Pasemos a un nuevo tema. Ahora, me gustaría hablar sobre variables y métodos estáticos".

"Ellie, ya aprendí sobre variables y métodos estáticos. Pero me gustaría conocer más detalles".

"Cuando declaramos variables en una clase, definimos si estas variables se crearán una sola vez o si cada instancia (objeto) de la clase tendrá su propia copia. Por defecto, se crea una nueva copia de una variable para cada objeto Así es como se ve:"

declaración de clase
class Cat                        // Class
{
    String name;                 // Variable

    Cat(String name)             // Constructor
    {
        this.name = name;        // Variable initialization
    }
}
Código en el método principal :
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);
Salida de pantalla
Oscar
Missy

"A pesar de estar declaradas en la misma clase (Cat), las variables cat1.namey cat2.namecontienen valores diferentes porque hacen referencia a objetos diferentes".
"Eso tiene sentido."
"Sin embargo, solo existe una copia de una variable estática para cada instancia de una clase, y se debe acceder a ella usando el nombre de la clase".

declaración de clase
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 en el método principal:
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);
Salida de pantalla:
0
1
Oscar
Missy
2

"Está bien, eso también tiene sentido".

"Los métodos de Java se dividen en dos categorías. Los métodos de instancia se invocan en un objeto y tienen acceso a los datos de ese objeto. Los métodos estáticos no tienen ese acceso, ya que simplemente no tienen una referencia de objeto. Sin embargo, pueden hacer referencia al variables estáticas de la clase y otros métodos estáticos.

¡Los métodos estáticos no pueden abordar métodos no estáticos o variables no estáticas!"

"¿Por qué es eso, Ellie?"

"Cada variable de instancia está contenida en un objeto. Solo se puede acceder si tiene una referencia a ese objeto. No hay tal referencia disponible para un método estático".

"¿Los métodos de instancia tienen tal referencia?"

"Sí, se pasa indirectamente a los métodos de instancia. Una referencia al objeto en el que se llama un método de instancia se pasa indirectamente al método de instancia. La variable que almacena esta referencia se llama this . Esto permite que el método acceda siempre al objeto datos o llame a otro método no estático en el mismo objeto.

En lugar de una referencia a un objeto, se pasa un valor nulo a los métodos estáticos. Es por eso que no pueden abordar variables y métodos no estáticos. Simplemente no tienen una referencia a un objeto asociado con estas variables y métodos".

"Está bien, Ellie, lo entiendo".

"Así es como funcionan los métodos no estáticos:

Cómo se ve el código
Cat cat = new Cat();
String name = cat.getName();
cat.setAge(17);
cat.setChildren(cat1, cat2, cat3);
lo que realmente sucede
Cat cat = new Cat();
String name = Cat.getName(cat);
Cat.setAge(cat, 17);
Cat.setChildren(cat, cat1, cat2, cat3);
Cuando llamas a un método usando <objeto> punto <nombre del método>, en realidad estás llamando a un método de clase y pasando ese mismo objeto como primer argumento. Dentro del método, el objeto se llama 'this' . Todas las operaciones en el método se realizan en este objeto y sus datos".

"Así es como funcionan los métodos estáticos:

Cómo se ve el código
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount();
lo que realmente sucede
Cat cat1 = new Cat();
Cat cat2 = new Cat();
int catCount = Cat.getAllCatsCount(null);
Cuando llamas a un método estático, no se le pasa ningún objeto. En otras palabras, 'esto' es igual a nulo . Es por eso que un método estático no puede acceder a variables y métodos no estáticos (ya que no tiene nada que pasar implícitamente a los métodos no estáticos)".

"Una variable o método es estático si tiene la palabra clave static delante".

"¿Por qué se necesitan tales métodos si están tan severamente limitados?"

"Bueno, tales métodos tienen sus beneficios".

"Primero, no tenemos que pasar una referencia de objeto para usar métodos y variables estáticos " .

"Segundo, a veces es necesario tener una y solo una copia de una variable. Por ejemplo, System.out (la variable de salida estática de la clase System)".

"Tercero, a veces necesita llamar a un método antes de poder crear objetos".

"Ellie, ¿puedes darme un ejemplo de esto?"

"¿Por qué cree que el método main() es estático? Es estático, por lo que el programador puede llamarlo inmediatamente después de cargar una clase en la memoria, antes de que se haya creado cualquier objeto".