Solución: no se puede hacer referencia al modo no estático desde el contexto estático

Mensaje de error de muchos programadoresNo se puede hacer referencia al modo no estático desde un contexto estático‘cuando están codificando. Este mensaje de error no es específico y puede ocurrir en cualquier IDE si las condiciones del error son verdaderas.

No se puede hacer referencia al modo no estático desde un contexto estático

Este es un error muy común para los principiantes cuando el programador intenta usar una clase ‘estáticamente’ sin hacer un ejemplo de la clase. Hay algunas condiciones que deben cumplirse cuando se usa una clase estática. En este artículo, analizaremos muchos escenarios diferentes y lo guiaremos sobre cómo usar una clase estática.

¿Qué es el modo estático?

Cuando se agrega la palabra clave ‘estático’ a cualquier método, el método se llama modo estático. El modo estático se aplica a la clase en lugar de a un objeto (que es la norma). El modo estático se puede invocar fácilmente sin crear la condición de una instancia de clase.

Los métodos estáticos tienen diferentes usos, por ejemplo, mientras los usa, puede cambiar un miembro de datos estáticos y su valor. Sin embargo, todavía existen algunas limitaciones al utilizar el modo estático. Por ejemplo, si desea acceder a áreas no estáticas de su clase, debe utilizar un método no estático. Entonces, para resumir, los métodos estáticos se usan con moderación pero tienen ventajas.

Aquí hay un breve ejemplo de cómo se puede usar un método estático para cambiar la propiedad de todo.

class Students{ 
 int roll_no; 
 String name; 
 static String college = "InformationTech"; 
 static void change(){ 
 college = “Management"; } 
 Students (int number, String name_self){ 
 roll_no = number; 
 name = name_self;  } 
 void display (){System.out.println(rollno+" "+name+" "+college);} 
public static void main(String args[]){ 
Students.change(); 
Students stu_1 = new Students (100,"Mexican"); 
Students stu_2 = new Students (202,"American"); 
Students stu_3 = new Students (309,"British"); 
stu_1.display(); 
stu_2.display(); 
stu_3.display(); 
}  }

Los resultados del programa son:

100 Mexican Management 202 American Management 309 British Management

¿Cuál es la diferencia entre una clase y un ejemplo de clase?

Imagina que estás caminando por la calle y ves un coche. Ahora sabe de inmediato que se trata de un automóvil, incluso si no conoce su modelo o tipo. Esto se debe a que sabe que pertenece a la clase ‘automóvil’ que ya conoce. Piense en una clase aquí como una plantilla o una idea.

Ahora, al acercarse, verá el modelo y la marca del automóvil. Aquí está identificando el «ejemplo» del coche de la clase. Aquí se presentarán todas las propiedades en detalle; las ruedas, los caballos de fuerza, las llantas, etc.

Un ejemplo de una propiedad es que la clase ‘automóvil’ dice que todos los automóviles deben tener ruedas. El automóvil que está viendo tiene llantas de aleación (ejemplo de clase de automóvil).

En la programación orientada a objetos, usted mismo define la clase y dentro de la clase, define un campo de tipo ‘color’. Siempre que la clase se reserva instantáneamente, la memoria se reserva automáticamente para el color durante el fin de semana y, más tarde, puede darle un valor especial (por ejemplo, rojo). Dado que atributos como este son específicos, no son estáticos.

Por el contrario, los modos y campos estáticos se comparten con todos los casos. Estos se realizan sobre el valor o los artículos que son específicos de la clase y no el caso en sí. Para los modos, puede haber modos globales (por ejemplo, convertidor stringtoInt) y para los campos, generalmente son constantes de acuerdo con su código (por ejemplo, el tipo de automóvil puede ser estático si no está fabricando automóviles sino automóviles comunes).

Ahora veamos todas las situaciones diferentes en las que su codificación puede salir mal y veamos las brechas de trabajo para solucionarlas.

Problema 1: estás llamando a algo que no existe

Encontramos varios casos en los que los usuarios usaban métodos tanto estáticos como no estáticos. Cuando hacemos esto, debe tener cuidado con qué método llama a qué (en términos estáticos o no). Ver el siguiente código:

private java.util.List<String> someMethod(){
    /* Some Code */
    return someList;           }
public static void main(String[] strArgs){         
     // The following statement causes the error. You know why..
    java.util.List<String> someList = someMethod();        }

Aquí, el modo estático está llamando a someMethod. En la programación orientada a objetos, incorporamos tanto los datos como los datos con los que queremos trabajar. Aquí, sin objeto, no hay datos de ejemplo y aunque los métodos de conveniencia son parte de la definición de la clase, siempre debe haber un ejemplo objetivo para proporcionarles datos.

Entonces, para resumir, no se puede llamar a algo que no existe. Debido a que es posible que no haya creado un objeto, el método no estático aún no existe. Por otro lado, sin embargo, siempre habrá un modo estático (debido a la definición).

Problema 2: no se realizan métodos estáticos

Si invoca métodos desde su modo estático principal sin crear un ejemplo de los métodos, obtendrá un mensaje de error. Aquí se aplica el mismo principio; no puede acceder a algo que no existe.

public class BookStoreApp2 {
    //constants for options
    Scanner input = new Scanner (System.in);
    public static void main(String[] args) {
        BookStoreItem[] item;//declaring array
        item = new BookStoreItem[10];//initializing array
        int itemType = -1;
        printMenu();
        getUserChoice();
        for (int i = 0; i < item.length; i++){
            }//end of switch statement
        }//end of for loop
        for (int i = 0; i < item.length; i++) {
        }//end of for
    }//end of main method

Aquí en este código, necesita convertir ambos métodos printMenu () y getUserChoice () en modos estáticos.

Por lo tanto, si desea sortear una situación como esta, puede constructor en lugar de. Por ejemplo, puede construir el contenido de su método principal () y colocarlo dentro de un constructor.

public BookStoreApp2()
{
   // Put contents of main method here}
After doing this, do the following inside your main() method:
public void main( String[] args )
{ 
new BookStoreApp2();           }

Si estos consejos no funcionan en su código o su código es diferente, debe tener en cuenta los principios básicos de las clases y métodos estáticos y volver a verificar su código para asegurarse de que no se infrinja el principio básico.