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


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

Por lo que entiendo, una subrutina es un 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 que sea impuro).

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

Con esto es la mente, sin embargo, no debería estática methods realmente ser funciones?

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

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

Author: Community, 2015-05-22

9 answers

Esta cita de 8.4.3.2 puede ayudar:

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

Un método que no se declara static se llama un 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 ámbito circundante que puede incluir estado. En cierto modo, la clase es como un objeto en sí.

 121
Author: Radiodef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-22 17:10:58

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

 75
Author: Bitcoin M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-22 17:09:34

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

Un método estático que utiliza 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 usando 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 es apátrida. (ANEXO: Mientras que los programadores a menudo no son tan estrictos con usando "función" como definición, una función estricta en ciencias de la computación solo puede acceder a los parámetros de entrada). Así que definiendo 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 C funciones globales derivadas y variables globales a las que se puede acceder en todas partes. Si no puede acceder a la clase que contiene métodos estáticos, los métodos son inaccesibles, demasiado. Por lo tanto, los" métodos estáticos " están limitados en su alcance por diseño en contraste con las funciones globales.

 26
Author: Thorsten S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-24 20:49:27

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

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.Clase.

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: Objective C, Smalltalk , y el JLS to por nombrar solo unos pocos.

 17
Author: Mike Clark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-26 06:34:17

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

Los miembros de datos y los miembros del método tienen dos espacios de nombre separados:.x y .x () puede coexistir.

Así que 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 categorizar un "miembro".

 11
Author: Joop Eggen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-22 17:10:23

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 entender por qué la terminología subsiste.

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

Método de instancia (dinámico)

No puede invocar esto método de una clase directamente, usted tiene que 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 subclase), 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 desde la clase directamente, 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 del 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.

 9
Author: Ely,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-24 03:07:00

Aquí hay otra versión de la terminología, usando Scala como mnemotécnica:
En Scala tienes objects, que son instancias singleton de una clase definida implícitamente1.

Según su definición, podemos llamar a estas subrutinas pertenecientes a la object métodos, 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 interfaz con Java) [2].

Por lo tanto, podemos decir que los métodos estáticos de la clase Java A acceden a los mismos miembros que la instancia Scala singleton, que por su definición merecen ser llamados (static) métodos de la clase A.

 7
Author: mucaho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:30:59

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

 2
Author: Павел Бивойно,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-27 14:59:54

Cada clase tiene un objeto para representarla 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 están restringidos a ser solo funciones (sin estado). Son métodos.

 1
Author: Bohemian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-28 15:40:51