utilidad usar programas metodos metodo method los estaticos cuando java static

usar - static final java



¿Cuál es la razón detrás de que "un método no estático no puede ser referenciado desde un contexto estático"? (13)

Esta pregunta ya tiene una respuesta aquí:

El error muy común de los principiantes es cuando intentas usar una propiedad de clase "estáticamente" sin crear una instancia de esa clase. Te deja con el mensaje de error mencionado:

Puede hacer que el método no estático sea estático o crear una instancia de esa clase para usar sus propiedades.

¿Por qué? No estoy pidiendo soluciones. Le agradecería saber cuál es la razón detrás de esto. La razón principal!

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(); }


¿Así que estás pidiendo una razón central?

Bueno, dado que se está desarrollando en Java, el compilador genera un código de objeto que la Máquina Virtual de Java puede interpretar. De todos modos, la JVM es un programa binario que se ejecuta en lenguaje de máquina (probablemente la versión de JVM específica para su sistema operativo y hardware fue compilada previamente por otro lenguaje de programación como C para obtener un código de máquina que pueda ejecutarse en su procesador). Al final, cualquier código se traduce a código de máquina. Por lo tanto, crear un objeto (una instancia de una clase) es equivalente a reservar un espacio de memoria (los registros de memoria que se registrarán como procesadores cuando el programador de la CPU del sistema operativo coloque su programa en la parte superior de la cola para ejecutarlo) tener un lugar de almacenamiento de datos que pueda leer y escribir datos. Si no tiene una instancia de una clase (lo que sucede en un contexto estático), entonces no tiene ese espacio de memoria para leer o escribir los datos. De hecho, como han dicho otras personas, los datos no existen (porque desde el principio usted nunca escribió ni había reservado el espacio de memoria para almacenarlos).

¡Lo siento por mi ingles! Soy latina


Acabo de darme cuenta, creo que la gente no debería estar expuesta al concepto de "estática" muy temprano.

Los métodos estáticos probablemente deberían ser la excepción y no la norma. Especialmente al principio de todos modos si quieres aprender OOP. (¿Por qué comenzar con una excepción a la regla?) Eso es muy antipedagógico de Java, que lo "primero" que debe aprender es el vacío público estático, lo principal. (De todas formas, pocas aplicaciones Java reales tienen sus propios métodos principales).


Creo que vale la pena señalar que, según las reglas del lenguaje Java, el compilador de Java inserta el equivalente de "esto". cuando se da cuenta de que está accediendo a métodos de instancia o campos de instancia sin una instancia explícita. Por supuesto, el compilador sabe que solo puede hacerlo desde un método de instancia, que tiene una variable "this", como no lo hacen los métodos estáticos.

Lo que significa que cuando estás en un método de instancia lo siguiente es equivalente:

instanceMethod(); this.instanceMethod();

Y estos también son equivalentes:

... = instanceField; ... = this.instanceField;

El compilador está insertando efectivamente el "esto". cuando no se proporciona una instancia específica.

Este poco de "ayuda mágica" por parte del compilador puede confundir a los principiantes: significa que las llamadas de instancia y las llamadas estáticas a veces parecen tener la misma sintaxis, mientras que en realidad son llamadas de diferentes tipos y mecanismos subyacentes.

La llamada al método de instancia a veces se denomina invocación o envío de un método debido a los comportamientos de los métodos virtuales que soportan el polimorfismo; el comportamiento de envío ocurre independientemente de si escribió una instancia de objeto explícito para usar o si el compilador insertó un "esto".

El mecanismo de llamada de método estático es más simple, como una llamada de función en un lenguaje que no es OOP.

Personalmente, creo que el mensaje de error es engañoso, podría decir "no se puede hacer referencia a un método no estático desde un contexto estático sin especificar una instancia de objeto explícita ".

De lo que se queja el compilador es que no puede simplemente insertar el estándar "esto". como lo hace dentro de los métodos de instancia, porque este código está dentro de un método estático; sin embargo, tal vez el autor simplemente se olvidó de proporcionar la instancia de interés para esta invocación; por ejemplo, una instancia posiblemente suministrada al método estático como parámetro, o creada dentro de este método estático.

En resumen, puede llamar métodos de instancia desde un método estático, solo necesita tener y especificar un objeto de instancia explícito para la invocación.


El compilador en realidad agrega un argumento a los métodos no estáticos. Añade un this pointer/reference. This is also the reason why a static method can not use this this pointer/reference. This is also the reason why a static method can not use this , porque no hay ningún objeto.


El método que está intentando llamar es un método de nivel de instancia; No tienes una instancia.

static métodos static pertenecen a la clase, static métodos no static pertenecen a instancias de la clase.


La esencia de la programación orientada a objetos es la lógica encapsulada junto con los datos en los que opera.

Los métodos de instancia son la lógica, los campos de instancia son los datos. Juntos, forman un objeto.

public class Foo { private String foo; public Foo(String foo){ this.foo = foo; } public getFoo(){ return this.foo; } public static void main(String[] args){ System.out.println( getFoo() ); } }

¿Cuál podría ser el resultado de ejecutar el programa anterior?

Sin un objeto, no hay datos de instancia, y mientras los métodos de instancia existen como parte de la definición de clase, necesitan una instancia de objeto para proporcionar datos para ellos.

En teoría, un método de instancia que no accede a ningún dato de instancia podría funcionar en un contexto estático, pero en realidad no hay ninguna razón para que sea un método de instancia. Es una decisión de diseño de lenguaje permitirlo de todos modos en lugar de inventar una regla adicional para prohibirlo.


La razón simple detrás de esto es que se puede acceder a los miembros de datos estáticos de la clase principal (solo si no están anulados), pero por ejemplo, los miembros de datos (no estáticos) o los métodos necesitamos su referencia y, por lo tanto, solo se pueden llamar a través de un objeto .


Las respuestas hasta ahora describen por qué, pero aquí hay algo más que quizás desee considerar:

Puede llamar a un método desde una clase instanciable agregando una llamada de método a su constructor,

Object instance = new Constuctor().methodCall();

o

primitive name = new Constuctor().methodCall();

Esto es útil si solo desea utilizar un método de una clase instanciable una vez dentro de un solo ámbito. Si llama a varios métodos desde una clase instanciable dentro de un solo ámbito, definitivamente cree una instancia referable.


No puedes llamar a algo que no existe. Dado que no ha creado un objeto, el método no estático todavía no existe. Siempre existe un método estático (por definición).


Si intentamos acceder a un método de instancia desde un contexto estático, el compilador no tiene forma de adivinar qué método de instancia (variable para qué objeto), se refiere. Sin embargo, siempre se puede acceder utilizando una referencia de objeto.


Un método estático relaciona una acción con un tipo de objeto, mientras que el método no estático relaciona una acción con una instancia de ese tipo de objeto. Típicamente es un método que hace algo con relación a la instancia.

Ex:

La clase de automóvil podría tener un método de lavado, lo que indicaría el lavado de un automóvil en particular, mientras que un método estático se aplicaría al tipo de automóvil.


Un método no estático depende del objeto. Es reconocido por el programa una vez que se crea el objeto.

Los métodos estáticos se pueden llamar incluso antes de la creación de un objeto. Los métodos estáticos son excelentes para realizar comparaciones u operaciones que no dependen de los objetos reales con los que planea trabajar.


si un método no es estático, eso "le dice" al compilador que el método requiere acceso a datos de nivel de instancia en la clase, (como un campo no estático). Estos datos no estarían disponibles a menos que se haya creado una instancia de la clase. Entonces, el compilador arroja un error si intenta llamar al método desde un método estático. Si en realidad el método NO hace referencia a ningún miembro no estático de la clase, haga que el método sea estático.

En Resharper, por ejemplo, solo crear un método no estático que NO haga referencia a ningún miembro estático de la clase genera un mensaje de advertencia "Este método puede hacerse estático"