¿Cuál es el equivalente de la palabra clave “estática” de C en Java?

6 minutos de lectura

avatar de usuario
Un geek

Quiero saber cuál podría ser la palabra clave equivalente en Java que podría realizar la misma función que “Palabra clave estática en C”. Quiero hacer recursividad en Java, realizando la misma función que hace una palabra clave estática en C…

Por favor ayuda..

  • Sé que probablemente está siendo cortés, pero no tiene que agradecernos a todos individualmente 🙂 Probablemente hubiera estado bien (y más fácil para usted) simplemente poner un agradecimiento general en esta área de comentarios.

    – pax diablo

    9 de abril de 2009 a las 2:07

avatar de usuario
adam rosenfield

C tiene dos usos completamente diferentes de la static palabra clave, y C++ agrega un tercer uso:

// Use 1: declare a variable or function to be local to a given module
// At global scope:
static int global_var;
static void func();

En este caso, la variable global global_var y la funcion void func() solo se puede acceder dentro del archivo en el que se declaran; ningún otro archivo puede acceder a ellos.

// Use 2: declare a variable inside a function with global scope
void func(void)
{
    static int x;
}

En este caso, la variable x es efectivamente una variable global, en el sentido de que solo hay una instancia de ella: múltiples llamadas a func() (incluidas las llamadas recursivas) siempre accederá a la misma variable.

// Use 3 (C++ only): declare a global variable with class scope
class Widget
{
public:
    static int var;
};

En este caso, declara la variable Widget::var como una variable global, pero su alcance es diferente. Fuera de las funciones de los miembros de la clase, debe nombrarse como Widget::var; dentro de las funciones de los miembros de la clase, se puede nombrar simplemente como var. También se puede hacer protected o private limitar aún más su alcance.

Ahora, ¿cuáles son los análogos de estos 3 usos en Java?

El caso 1 no tiene un análogo directo; lo más cercano es declarar objetos con alcance de paquete, lo que se hace omitiendo un public, protectedo private:

class Widget  // Declare a class with package scope
{
    int x;  // Declare a member variable with package scope
    void func() {}  // Declare a member function with package scope
}

En este caso, los objetos declarados solo son accesibles por clases dentro del mismo paquete; no son accesibles para otros paquetes.

El caso 2 tampoco tiene un análogo en Java. Lo más cerca que puede estar es declarando una variable global (es decir, una variable de clase estática, ya que Java no tiene verdaderas variables globales en el sentido más estricto):

class Widget
{
    private static int func_x;
    public static void func()
    {
        // use func_x here in place of 'static int x' in the C example
    }
}

El caso 3 es el único caso que tiene un directo analógico en Java. En este caso, el static palabra clave tiene exactamente el mismo propósito.

  • Espera, pensé que el uso n. ° 2 también existía en Java, al declarar una variable como static permitirá que su valor persista entre llamadas a la función. Sin embargo, ha pasado tanto tiempo desde que usé Java que podría estar equivocado.

    – JAB

    11 de julio de 2011 a las 20:34


  • Montón de volcado de información innecesaria. El OP ni siquiera menciona C ++ y son bastante claros sobre qué variante de static en C que necesitan. Todo lo que se requiere fue el Caso 2 de esta respuesta. Mantenlo al punto.

    – Stillanoob

    14 de febrero de 2019 a las 6:59

avatar de usuario
paxdiablo

Él "static" La palabra clave en C en realidad cumple dos funciones dependiendo de dónde se use. Esas funciones son visibilidad y duración (estos son mis términos basados ​​en un poco de enseñanza, el estándar, si está interesado en ese nivel de detalle, usa diferentes términos que a menudo confunden a los nuevos estudiantes, de ahí mi reticencia a usarlos) ).

  • Cuando se usa a nivel de archivo, marca un elemento (variable o función) como no exportado para que un enlazador no pueda verlo. Esto es estático como en la visibilidad, la duración es la misma que la del programa (es decir, hasta que el programa finaliza). Esto es útil para encapsular el elemento dentro de una sola unidad de compilación (un archivo fuente, en su definición más simple). El elemento está disponible para toda la unidad de compilación (suponiendo que se declare antes de su uso).
  • Cuando se usa dentro de una función, controla la duración (la visibilidad está limitada dentro de la función). En este caso, el elemento también se crea una vez y perdura hasta que finaliza el programa. Las variables no estáticas dentro de una función se crean y destruyen al entrar y salir de la función.

Deduzco que lo que busca es el primer tipo, básicamente una variable global, ya que no puedo ver de inmediato un uso para la otra variante en la recursividad.

No se puede hacer ya que, en Java, todo debe pertenecer a una clase. La solución es crear una clase que contenga los “globales” y:

  • pase ese objeto para que pueda hacer referencia a sus miembros; o
  • construya un elemento singleton para que pueda acceder a sus miembros.

Java no tiene variables globales, por lo que no hay un equivalente directo. Sin embargo, hay un static palabra clave en Java que comparte el estado de un campo con todas las instancias de una clase, lo cual es una buena aproximación a lo que está describiendo.

Quiero hacer recursividad en Java, realizando la misma función que hace una palabra clave estática en C …

Sin embargo, si está buscando hacer recursividad, ¿Estás seguro de que las variables estáticas son lo que necesitas? Cualquier estado especial necesario para una llamada de función recursiva casi siempre se devuelve a sí mismo, no se mantiene por separado.

  • Lo que John mencionó parece absolutamente cierto, dudo del uso de variables estáticas en funciones recursivas. Sería limpio si también pudieras escribir la función recursiva…

    – FL4SOF

    8 de abril de 2009 a las 5:28

  • No hay problema. Si tiene otra pregunta sobre funciones recursivas, continúe y pregunte esa también.

    – Juan Feminella

    9 de abril de 2009 a las 3:52

El concepto de estático en Java no se adhiere al concepto de estático en C. Sin embargo, hay un estático palabra clave en Java también. Pero es más como un estático en C++ y luego en C, con algunas diferencias.

Puede simular una clase estática en Java de la siguiente manera:

   /**
     * Utility class: this class contains only static methods and behaves as a static class.
     */

public abstract class Utilities
    {
        // prevent inheritance
        private Utilities()
        {
        }
    // ... all your static methods here
        public static Person convert(string) {...}
    }

Esta clase no se puede heredar (como final porque, aunque abstracta, tiene un constructor privado), no se puede instanciar (como static porque es abstracta), por lo que solo se pueden llamar a los métodos estáticos.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad