This article needs additional citations for verification. (June 2022) |
This article is missing information about the use of the static keyword to declare class methods in C++ and Java.(April 2014) |
static
es una palabra reservada en muchos lenguajes de programación para modificar una declaración. El efecto de la palabra clave varía según los detalles del lenguaje de programación específico, y se usa más comúnmente para modificar el tiempo de vida (como una variable estática ) y la visibilidad (según el enlace ), o para especificar un miembro de clase en lugar de un miembro de instancia en las clases.
En los predecesores de C, incluidos BCPL y B , ya existía un concepto de almacenamiento estático . [1] [2] , lo que significaba un almacenamiento que siempre existe. Sin embargo, en B, no había una static
palabra clave, pero había una extrn
palabra clave para especificar el almacenamiento externo (externo a todas las funciones y debe definirse fuera de una función), que siempre es estático, en contraste con auto
la palabra clave, que declaraba una variable con almacenamiento automático : aparece siempre que se invoca la función y desaparece cuando se abandona la función. [2] Todas las variables deben declararse, como una de auto
, extrn
o implícitamente como argumentos de la función.
C se desarrolló como sucesor de B, y se añadieron las palabras clave y como static
especificadores de clase de almacenamiento , junto con y , que conservaron su significado de B. Sin embargo, en C se introdujo el concepto de enlace para variables fuera de las funciones. Un programa puede estar formado por múltiples unidades de compilación y enlazarse entre sí para formar un programa completo, en el que una variable o función puede especificarse como que tiene enlace interno (visible solo para su propia unidad de compilación) o enlace externo (visible para todo el programa). Estas palabras clave especifican tanto la duración del almacenamiento como el enlace de la siguiente manera: [3]register
auto
extern
Clase de almacenamiento | Duración | Enlace |
---|---|---|
extern | estática (ejecución del programa) | externo (todo el programa) |
static | estática (ejecución del programa) | interno ( sólo unidad de traducción ) para identificador de nivel superior ninguno para variables de ámbito de bloque |
auto ,register | ejecución de función | ninguno |
Cada variable y función tiene una de estas clases de almacenamiento; si una declaración no especifica la clase de almacenamiento, se utiliza un valor predeterminado dependiente del contexto:
extern
para todas las declaraciones de nivel superior en un archivo fuente,auto
para variables declaradas en cuerpos de funciones.Entonces, en C, aunque la static
palabra clave, cuando se usa en variables, siempre declara una variable con duración de almacenamiento estática, hay dos significados distintos de la palabra clave, dependiendo de dónde se use:
Por lo tanto, en C, el término "variable estática" tiene dos significados que son fáciles de confundir:
static
.Las variables con clase de almacenamiento extern
, que incluyen variables declaradas en el nivel superior sin una clase de almacenamiento explícita, están static
en el primer significado pero no en el segundo.
En C++ (no C), la static
palabra clave también se puede utilizar para declarar que una variable miembro de una clase tiene una duración de almacenamiento estática, independiente de la duración de almacenamiento del objeto de clase en sí, y dicha variable debe definirse fuera de la clase. El efecto es que la variable se comparte entre todas las instancias de la clase, convirtiéndose en un miembro de la clase en lugar de un miembro de la instancia. Cuando se aplica a una función miembro (método), especifica que la función miembro opera independientemente de una instancia, lo que significa que no puede acceder a ningún miembro no estático de la clase ni al this
puntero.
La static
palabra clave se utiliza en muchos lenguajes de programación para especificar que una variable local tendrá una duración de vida de todo el programa, preservada entre invocaciones de funciones, en lugar de tener su propia copia para cada invocación de función como en la duración de almacenamiento automático, heredada del uso en C.
Algunos ejemplos de lenguajes de programación que admiten el uso de static
palabras clave para mantener las variables locales durante la invocación incluyen C , C++ , Objective-C , C# y PHP .
Los siguientes lenguajes de programación con sintaxis similar a C no admiten static
variables locales como en C: Java , JavaScript y Dart . En estos lenguajes, una variable que se conserva durante toda la ejecución del programa debe declararse fuera de las funciones.
La static
palabra clave en C, cuando se utiliza como una declaración de nivel superior, hace que la variable o función sea visible solo para su propia unidad de compilación. Los lenguajes de programación modernos generalmente utilizan espacios de nombres para evitar conflictos de nombres, por lo que este uso no se adopta ampliamente, excepto en los lenguajes de programación que tienen en mente la compatibilidad con C (por ejemplo, C++ , Objective-C ). Otros lenguajes de programación que admiten declaraciones de visibilidad en el nivel superior utilizan una variedad de otras palabras clave para especificar diferentes niveles de visibilidad, por ejemplo, public
en Java para clases que se pueden usar en todas partes, o internal
/ file
en C#. [4]
La static
palabra clave se utiliza en la mayoría de los lenguajes de programación con clases para especificar que un miembro sea un miembro de la clase, en lugar de un miembro de instancia, heredado del uso de C++.
Un miembro estático de una clase tiene las siguientes características:
this
referencia a la instancia actual.Algunos lenguajes de programación incluso van más allá, permitiendo el uso de static
palabras clave en otros lugares de una declaración o uso de clase, por ejemplo:
this
referencia al objeto de la clase externa y deben existir en el contexto de una instancia de la clase externa. Al declarar una clase interna como static
, no lleva dicha referencia y se puede usar independientemente de una instancia de la clase externa.static
palabra clave se puede utilizar en lugar de un nombre de clase real para acceder a miembros estáticos y proporcionar polimorfismo a nivel de clase, llamados enlaces estáticos tardíos [5].La static
palabra clave se puede utilizar en algunos lenguajes de programación en funciones anónimas para evitar la captura de estados que se capturan de forma predeterminada. Es similar a las variables locales estáticas y a los miembros de clase estáticos en el sentido de que un cierre estático no depende de la invocación en ejecución de la función que la contiene.
$this
referencia automáticamente vinculada a él, la static
palabra clave evita esto.static
palabra clave especifica que no se deben capturar estados externos. [6]