Solución: no se puede hacer referencia a un método no estático desde un contexto estático

Muchos programadores se enfrentan al mensaje de error " No se puede hacer referencia a un método no estático desde un contexto estático " cuando codifican. Este mensaje de error no es específico y puede ocurrir en cualquier IDE si las condiciones para el error son verdaderas.

El método no estático no puede ser referenciado desde un contexto estático

Este es un error muy común para principiantes donde el programador intenta usar una clase 'estáticamente' sin hacer una instancia de la clase. Hay varias condiciones que deben cumplirse cuando utiliza una clase que es estática. En este artículo, revisaremos varios casos diferentes y lo guiaremos sobre cómo usar una clase estática.

¿Qué es un método estático?

Agregar la palabra clave 'static' a cualquier método hace que el método sea conocido como método estático. Un método estático pertenece a la clase en lugar de pertenecer a un objeto (que es la norma). Se puede invocar fácilmente un método estático sin la condición de crear una instancia de una clase.

Hay varios usos diferentes de los métodos estáticos, por ejemplo, al usarlo, puede cambiar un miembro de datos estáticos y su valor. Sin embargo, todavía hay algunas limitaciones cuando se utiliza un método estático. Por ejemplo, si desea acceder a campos no estáticos de su clase, debe usar un método no estático. En resumen, los métodos estáticos se usan muy poco pero tienen sus beneficios.

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

 Estudiantes de clase {int roll_no; Nombre de cadena; 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 = nuevos estudiantes (309, "británico"); stu_1.display (); stu_2.display (); stu_3.display ();}} 

El resultado del programa será:

 100 Gestión mexicana 202 Gestión estadounidense 309 Gestión británica 

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

Piensa que camina por la calle y ve un automóvil. Ahora sabe de inmediato que se trata de un automóvil, incluso si no sabe cuál es su modelo o tipo. Esto se debe a que sabes que pertenece a la clase de 'autos' que ya conoces. Piense en la clase aquí como una plantilla o una idea.

Ahora, a medida que te acercas, ves el modelo y la marca del automóvil. Aquí está reconociendo la 'instancia' de la clase 'auto'. Aquí todas las propiedades estarán presentes en detalle; las ruedas, la potencia, las llantas, etc.

Un ejemplo de propiedades puede ser que la clase 'automóvil' establece que todos los automóviles deben tener ruedas. El automóvil que está viendo (una instancia de la clase de automóviles) tiene llantas de aleación.

En la programación orientada a objetos, usted define la clase usted mismo y dentro de la clase, define un campo del tipo 'color'. Cada vez que se crea una instancia de la clase, la memoria se reserva automáticamente para el color en el backend y más adelante, puede asignarle un valor específico (por ejemplo, rojo). Como atributos como estos son específicos, no son estáticos.

Por el contrario, los métodos y campos estáticos se comparten con todas las instancias. Estos están hechos para valores o elementos que son específicos de la clase y no de la instancia en sí. Para los métodos, puede haber métodos 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 solo está fabricando automóviles normales).

Ahora, veremos todos los diferentes casos en los que su codificación puede salir mal y veremos las soluciones para solucionarlos.

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

Encontramos algunos casos en los que los usuarios usaban métodos estáticos y no estáticos entre sí. Cuando hacemos esto, debe tener cuidado con qué método está llamando qué (en términos de estático o no). Echa un vistazo al siguiente código:

 private java.util.List someMethod () {/ * Some Code * / return someList; } public static void main (String [] strArgs) {// La siguiente declaración causa el error. Ya sabes por qué ... java.util.List someList = someMethod (); } 

Aquí, el método estático está llamando a someMethod. En la programación orientada a objetos, encapsulamos los datos junto con los datos sobre los que queremos operar. Aquí, sin un objeto, no hay datos de instancia y, aunque los métodos de instancia existen como parte de la definición de clase, siempre debe haber una instancia de objeto para proporcionarles datos.

En resumen, no se puede llamar a algo que no existe. Como es posible que no haya creado un objeto, el método no estático aún no existe. Sin embargo, por otro lado, siempre existirá un método estático (debido a la definición).

Problema 2: los métodos no se hacen estáticos

Si está invocando métodos desde su método principal Estático sin crear una instancia de los métodos, recibirá un mensaje de error. Aquí, se aplica el mismo principio; no puedes acceder a algo que no existe.

 clase pública BookStoreApp2 {// constantes para opciones Scanner input = new Scanner (System.in); public static void main (String [] args) {BookStoreItem [] item; // declarando array item = new BookStoreItem [10]; // inicializando array int itemType = -1; printMenu (); getUserChoice (); for (int i = 0; i <item.length; i ++) {} // final de la declaración de cambio} // end of for loop for (int i = 0; i <item.length; i ++) {} // end de for} // fin del método principal 

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

Por lo tanto, si desea evitar una situación como esta, puede usar un constructor en su lugar. Por ejemplo, puede tomar los contenidos de su método main () y colocarlos dentro de un constructor.

 public BookStoreApp2 () {// Ponga el contenido del método principal aquí} Después de hacer esto, haga lo siguiente dentro de su método main (): 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 viole el principio básico.

Artículos De Interés