Por qué no se puede hacer referencia a una variable no estática desde un método estático en Java

Java es uno de los lenguajes y plataformas de programación más populares y ampliamente utilizados. Java está orientado a objetos . Sin embargo, no se considera puramente orientado a objetos, ya que brinda soporte para tipos de datos primitivos (como int, char, etc.). En java, los métodos se pueden declarar como estáticos o no estáticos. En este artículo, analicemos por qué no se puede hacer referencia a una variable no estática desde un método estático. 
Antes de entrar en el error, primero comprendamos qué significa cada uno de los métodos: 
 

  • Método estático: un método estático es un método que pertenece a una clase, pero no pertenece a una instancia de esa clase y este método se puede llamar sin la instancia u objeto de esa clase. En el método estático, el método solo puede acceder a miembros de datos estáticos y métodos estáticos de otra clase o de la misma clase, pero no puede acceder a métodos y variables no estáticos.
  • Método no estático: cualquier método cuya definición no contenga la palabra clave estática es un método no estático. En el método no estático, el método puede acceder a miembros de datos estáticos y métodos estáticos, así como a miembros y métodos no estáticos de otra clase o de la misma clase, también puede cambiar los valores de cualquier miembro de datos estáticos.

¿Cuál es el problema con la variable no estática a la que se hace referencia desde un contexto estático?
Consideremos el siguiente código donde la clase A se crea con una variable no estática y un método estático. El objeto de esta clase se crea en otra clase y se accede al método estático de la siguiente manera:
 

JAVA

// Java program to demonstrate
// why a non-static variable cannot
// be accessed from a static context
 
// Creating a class A
class A {
 
    // A non-static variable
    int N;
 
    // Static method
    public static void increment()
    {
          // this throws a compile - time error.     
        N++;
    }
}
 
public class Demo {
 
    // Main method
    public static void main(String args[])
    {
        // Creating multiple objects
        // for class A
        A obj1 = new A();
        A obj2 = new A();
        A obj3 = new A();
 
        // Assigning the different values
        // for the non static variable N
        obj1.N = 3;
        obj2.N = 4;
        obj3.N = 5;
 
        // Calling the method
        A.increment();
 
        System.out.println(obj1.N);
        System.out.println(obj2.N);
        System.out.println(obj3.N);
    }
}

SI este código realmente pudiera ejecutarse, esperaría que el resultado fuera: 
 

4
5
6

Pero en su lugar, se lanza un error en tiempo de compilación
 

Compile Errors:

prog.java:16: error: non-static variable N cannot be referenced from a static context
        N++;
        ^
1 error

Como podemos ver, el programa anterior da el error. Aunque en el código anterior, todos los nombres de los objetos tienen el mismo nombre de variable N, si intentamos incrementar N, está dando un error. Este error es muy común durante la programación orientada a objetos
¿Por qué ocurre este error?
Para la variable no estática, se necesita una instancia de objeto para llamar a las variables. También podemos crear múltiples objetos asignando diferentes valores para esa variable no estática. Entonces, diferentes objetos pueden tener diferentes valores para la misma variable. En el programa anterior hemos creado tres objetos obj1 , obj2 , obj3 para la clase A y hemos asignado los tres valores diferentes 3 ,4 , 5 para los objetos obj1 , obj2 , obj3 respectivamente. Cuando tratamos de llamar a la función increment , como cada objeto de N tiene su propio valor, habrá ambigüedad para que el compilador entienda para qué valor de N debe el método incrementar el valor.
¿Cómo resolver este error?  
Para evitar la ambigüedad, el compilador de Java arroja un tiempo de compilaciónerror. Por lo tanto, este problema se puede resolver abordando las variables con los nombres de los objetos. En resumen, siempre necesitamos crear un objeto para referirnos a una variable no estática desde un contexto estático. Cada vez que se crea una nueva instancia, se crea una nueva copia de todas las variables y métodos no estáticos. Al usar la referencia de la nueva instancia, se puede acceder a estas variables. Por ejemplo:
 

Java

// Java program to access a
// non static variable from
// a static block
public class GFG {
 
    int count = 0;
 
    // Driver code
    public static void main(String args[])
    {
 
        // Accessing static variable
        // by creating an instance
        // of the class
        GFG test = new GFG();
 
        test.count++;
        System.out.println(test.count);
    }
}
Producción

1

Publicación traducida automáticamente

Artículo escrito por hrishikeshkonderu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *