Por qué no está en condiciones de declarar una clase como estática en Java?

StackOverflow https://stackoverflow.com/questions/3584113

  •  01-10-2019
  •  | 
  •  

Pregunta

Por qué no estás en condiciones de declarar una clase como estática en Java?

¿Fue útil?

Solución

Sólo clases anidadas pueden ser estáticos. De esta manera puede utilizar la clase anidada sin tener una instancia de la clase externa.

class OuterClass{
    public static class StaticNestedClass{
    }

    public class InnerClass{
    }

    public InnerClass getAnInnerClass(){
        return new InnerClass();
    }

    //This method doesn't work
    public static InnerClass getAnInnerClassStatically(){
        return new InnerClass();
    }
}

class OtherClass{
    //Use of a static nested class:
    private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

    //Doesn't work
    private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

    //Use of an inner class:
    private OuterClass outerclass= new OuterClass();
    private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
    private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}

Fuentes:

Sobre el mismo tema:

Otros consejos

clases de nivel superior son estáticas por defecto. Las clases internas no son estáticas por defecto. Puede cambiar las preferencias para las clases internas marcando explícitamente estática. clases de nivel superior, en virtud de ser de nivel superior, no pueden tener la semántica no estáticos porque no puede haber ninguna clase padre para referirse a. Por lo tanto, no hay manera de cambiar el valor predeterminado para clases de nivel superior.

Por lo tanto, estoy llegando tarde a la fiesta, pero aquí está mi granito de arena -. Filosóficamente añadir a la respuesta de Colin Hebert

A un alto nivel de sus cuestión se refiere a la diferencia entre los objetos y tipos. Si bien hay muchos coches (objetos), sólo hay una clase Car (tipo). Declarar algo como medios estáticos que están operando en el espacio de "tipo". Sólo hay uno. La palabra clave clase de nivel superior ya define un tipo en el espacio "tipo". Como resultado, "clase Car public static" es redundante.

Clase con el constructor privado es estática.

Declarar su clase como esta:

public class eOAuth {

    private eOAuth(){}

    public final static int    ECodeOauthInvalidGrant = 0x1;
    public final static int    ECodeOauthUnknown       = 0x10;
    public static GetSomeStuff(){}

}

y se puede utilizar sin inicialización:

if (value == eOAuth.ECodeOauthInvalidGrant)
    eOAuth.GetSomeStuff();
...

Claro que pueden, pero sólo interiores clases anidadas. Hay, significa que las instancias de la clase anidada no requieren una instancia que encierra de la clase externa.

Sin embargo, para clases de nivel superior, los diseñadores del lenguaje no podía pensar en nada útil que hacer con la palabra clave, por lo que no está permitido.

Se puede crear una clase de utilidad (que no puede tener instancias creadas) por la que se declara un tipo de enumeración sin instancias. es decir, que se está declarando especificamente que no existen casos.

public enum MyUtilities {;
   public static void myMethod();
}
public class Outer {
   public static class Inner {}
}

... puede ser declarado estática -., Siempre y cuando se trata de un miembro de la clase

A partir de los JLS:

  

clases de miembros pueden ser estáticos, en cuyo caso no tienen acceso a las variables de instancia de la clase circundante; o pueden ser clases internas (§8.1.3).

y aquí:

  

La palabra clave estática puede modificar la declaración de un tipo de miembro de C dentro del cuerpo de un T. clase no interior Su efecto es declarar que C no es una clase interna. Así como un estático método de T no tiene ninguna instancia actual de T en su cuerpo, C también tiene ninguna instancia actual de T, ni tampoco tiene ningún casos léxico que encierran.

A estática palabra clave no tendría sentido para una clase de nivel superior, sólo porque una clase de nivel superior tiene ningún tipo envolvente.

Como se explicó anteriormente, una clase no puede ser estática a menos que sea un miembro de otra clase.

Si usted está mirando para diseñar una clase "de los cuales no puede haber varias instancias", es posible que desee ver en el patrón de diseño "Singleton".

aquí .

Advertencia:

  

Si está pensando en usar la   patrón Singleton, resistir con toda   tu fuerza. Es uno de los más fáciles   DesignPatterns de entender, probablemente   los más populares, y sin duda el   que más se abusa.    (fuente: JavaRanch como vinculado anteriormente)

Además de la forma de Java define clases internas estáticas, hay otra definición de clases estáticas como por el mundo C # [1] . Una clase estática es aquella que tiene sólo métodos estáticos (funciones) y que está destinado a apoyar la programación de procedimiento. Estas clases no son realmente clases en que el usuario de la clase sólo está interesado en las funciones auxiliares y no en la creación de instancias de la clase. Mientras que las clases estáticas están soportados en C #, no existe tal apoyo directo en Java. Sin embargo, puede utilizar enumeraciones a clases imitan estáticos C # en Java, por lo que un usuario no puede crear instancias de una clase determinada (incluso utilizando la reflexión) [2] :

public enum StaticClass2 {
    // Empty enum trick to avoid instance creation
    ; // this semi-colon is important

    public static boolean isEmpty(final String s) {
        return s == null || s.isEmpty();
    }
}

Todo el código en Java que entra en una clase. Cada vez que se corre una clase JVM crea la instancia de un objeto. JVM puede crear una serie de objetos, por definición estática significa que tiene el mismo conjunto de copia a todos los objetos.

Por lo tanto, si Java habría permitido a la clase superior para ser estática cuando se ejecuta un programa que crea un objeto y mantiene anulando a la misma ubicación de memoria.

Si sólo va a sustituir el objeto cada vez que se ejecuta cuál es el punto de crearla?

Así que esa es la razón de Java se deshizo de la estática de la parte superior de nivel de clase.

Puede haber razones más concretas pero esto tenía sentido mucho más lógico para mí.

Las únicas clases que pueden ser estáticas son clases internas. El siguiente código funciona bien:

public class whatever {
    static class innerclass {
    }
}

El punto de clases internas estáticas es que no tienen una referencia a la clase de objeto exterior.

creo que esto es posible tan fácil como beber un vaso de café !. Basta con echar un vistazo a esto. No utilizamos la palabra clave estática mientras se define explícitamente clase.

public class StaticClass {

    static private int me = 3;
    public static void printHelloWorld() {
       System.out.println("Hello World");
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

No es una definición de clase estática? Sólo tiene que utilizar una función binded a sólo una clase. Tenga cuidado de que en este caso podemos utilizar otra clase en que anidado. Vistazo a esto:

class StaticClass1 {

    public static int yum = 4;

    static void  printHowAreYou() {
        System.out.println("How are you?");
    }
}

public class StaticClass {

    static int me = 3; 
    public static void printHelloWorld() {
       System.out.println("Hello World");
       StaticClass1.printHowAreYou();
       System.out.println(StaticClass1.yum);
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

Uno puede mirar a PlatformUI en Eclipse para una clase con métodos estáticos y constructor privado con ella misma será definitiva.

public final class <class name>
{
   //static constants
   //static memebers
}

si el beneficio de utilizar una clase estática no era crear una instancia de un objeto y el uso de un método a continuación, sólo declarar la clase como pública y este método como estática.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top