method example java methods static static-methods terminology

java - example - ¿Por qué un método estático se considera un método?



static method php (9)

Aquí hay otra versión de la terminología, usando Scala como mnemónico:
En Scala tiene object s, que son instancias singleton de una clase Scala implícitamente definida.

Según su definición, podemos llamar a estas subrutinas que pertenecen a los métodos de object , ya que operan en una sola instancia de la clase.
Además, el objeto también definirá la clase A y creará todos los métodos en el objeto A como métodos estáticos en la clase A (para interactuar con Java) [2] .

Por lo tanto, podemos decir que los métodos estáticos de la clase A de Java acceden a los mismos miembros que la instancia Singleton de Scala, que según su definición merecen llamarse métodos (estáticos) de la clase A.

Estoy escribiendo una explicación de algún código para un curso, y accidentalmente he estado usando las palabras method y function intercambiable. Decidí volver y arreglar la redacción, pero me encontré con un agujero.

Por lo que entiendo, una subrutina es una function si no actúa en una instancia de una clase (su efecto está restringido a su entrada / salida explícita), y es un method si opera en una instancia de una clase ( puede llevar a cabo efectos secundarios en la instancia que lo hacen impuro).

Aquí hay una buena discusión sobre el tema. Tenga en cuenta que según las definiciones de las respuestas aceptadas, un method estático debería ser una función porque una instancia nunca se pasa implícitamente y no tiene acceso a los miembros de ninguna instancia.

Con esto en mente, ¿no deberían los methods estáticos ser funciones?

Por su definición, no actúan en instancias particulares de una clase; solo están "atados" a la clase debido a su relación. Sin embargo, he visto algunos sitios atractivos que se refieren a las subrutinas estáticas como "métodos" ( Oracle , Fredosaurus , ProgrammingSimplified ), por lo que o bien pasan por alto la terminología o me falta algo (supongo que es lo último) .

Me gustaría asegurarme de que estoy usando la redacción correcta.
¿Alguien puede aclarar esto?


Cada clase tiene un objeto para representarlo que es una instancia de una subclase de la clase Class . Los métodos estáticos son realmente métodos de instancia en estos objetos que son instancias de una subclase de Clase. Tienen acceso al estado en forma de campos estáticos, por lo que no se limitan a ser solo funciones (sin estado). Son métodos.


En Java, una clase definida por el usuario es en realidad una instancia de una subclase de java.lang.Class.

En este sentido, los métodos estáticos se adjuntan a una instancia de una clase conceptual: se adjuntan a una instancia de una subclase de java.lang.Class.

Con esto en mente, el término "método de clase" (un nombre alternativo para los métodos estáticos de Java) comienza a tener sentido. Y el término "método de clase" se puede encontrar en muchos lugares: Objetivo C, Smalltalk y JLS, por nombrar solo algunos.


En informática, la función se asigna claramente a un método estático. Pero el "método" de una clase es un poco genérico, como "miembro" (miembro de campo, miembro de método). Hay palabras como

Los miembros de datos y los miembros de métodos tienen dos espacios de nombre separados: .x y .x () pueden coexistir.

Entonces, la razón es que, como dijo el filósofo Ludwig Wittgenstein, el lenguaje es una herramienta con diferentes contextos. "Método" es un buen apodo en la cita anterior para clasificar a un "miembro".


Esta cita de 8.4.3.2 puede ayudar:

Un método que se declara static se llama método de clase .

Un método que no se declara static se llama método de instancia [...].

  • Métodos de clase: asociados con una clase.
  • Métodos de instancia: asociados con una instancia.

Java solo quiere que "pienses orientado a objetos". Además, los métodos estáticos tienen acceso a un alcance circundante que puede incluir el estado. En cierto modo, la clase es como un objeto en sí mismo.


La respuesta simple es que cuando Java decidió llamar a todo "método", no les importó la distinción entre una función y un método en informática teórica.


Los métodos estáticos no son exactamente funciones, la diferencia es sutil, pero importante.

Un método estático que usa solo parámetros de entrada dados es esencialmente una función.

Pero los métodos estáticos pueden acceder a variables estáticas y otras funciones estáticas (también utilizando variables estáticas), por lo que los métodos estáticos pueden tener un estado que es fundamentalmente diferente a una función que, por definición, no tiene estado . (ADENDA: Si bien los programadores a menudo no son tan estrictos con el uso de "función" como definición, una función estricta en informática solo puede acceder a los parámetros de entrada). Por lo tanto, definir este caso de acceso a campos estáticos no es válido decir que los métodos estáticos son siempre funciones.

Otra diferencia que justifica el uso del "método estático" es que puede definir en derivadas de C funciones globales y variables globales a las que se puede acceder desde cualquier lugar. Si no puede acceder a la clase que contiene métodos estáticos, los métodos también son inaccesibles. Por lo tanto, los "métodos estáticos" están limitados en su alcance por diseño en contraste con las funciones globales.


Por supuesto, la principal diferencia es que el método puede usar campos estáticos, no solo parámetros del método. Pero hay uno adicional: ¡el polimorfismo! Los resultados de la evaluación Clase A.doTheSameStaticMethod () y ClassB.doTheSameStaticMehod () dependerán de la clase. En este caso la función es impotente.


Tu pensamiento es correcto y tiene sentido. Simplemente no es una terminología establecida en la comunidad Java. Permítanme explicar algunos aspectos internos que pueden ayudar a comprender por qué subsiste la terminología.

Java es un lenguaje orientado a objetos basado en clases. Un método siempre es miembro de una clase o instancia (esta es una declaración general válida para otros lenguajes de programación también). Pensamos que clase e instancia son ambos objetos.

Método de instancia (dinámico)

No puede invocar este método directamente desde una clase, debe crear una instancia. Cada instancia hace referencia a ese método. Puede sobrescribir una definición de método con exactamente la misma firma de método (cuando se subclasifican), es decir, los puntos de referencia a un método diferente (que tiene la misma firma, pero puede tener un cuerpo de método diferente). El método es dinámico.

Método de clase (estático)

Solo puede invocar este método directamente desde la clase, es decir, no necesita crear una instancia de esa clase. Solo hay una definición global de ese método en todo el programa. No puede sobrescribir exactamente la misma firma de método cuando el método se declara estático, porque solo hay una definición válida para todo el programa. Tenga en cuenta que el método es miembro del objeto de clase en sí, las instancias tienen la misma referencia única (y fija) a ese método.