¿Por qué no puede declarar una clase como estática en Java?
java
static-class
Mariselvam
fuente
fuente
static
?static
clases comoabstract final
, es decir, no se pueden instanciar y no se pueden extender. Esto significa que solo pueden contener miembros estáticos, lo cual es útil para clases que solo contienen métodos auxiliares.Respuestas:
Solo las clases anidadas pueden ser estáticas. Al hacerlo, puede usar la clase anidada sin tener una instancia de la clase externa.
Fuentes:
Sobre el mismo tema:
fuente
Las clases de nivel superior son estáticas por defecto. Las clases internas no son estáticas por defecto. Puede cambiar el valor predeterminado para las clases internas marcándolas explícitamente como estáticas. Las clases de nivel superior, en virtud de ser de nivel superior, no pueden tener una semántica no estática porque no puede haber una clase principal a la que hacer referencia. Por lo tanto, no hay forma de cambiar el valor predeterminado para las clases de nivel superior.
fuente
static
palabra clave en una clase de nivel superior denotara y aplicara que solo puede contener miembros estáticos y no ser instanciada; Sin embargo, eso podría haber confundido a las personas, ya questatic
tiene un significado diferente para las clases anidadas.Entonces, llego tarde a la fiesta, pero aquí están mis dos centavos, filosóficamente añadiendo a la respuesta de Colin Hebert.
En un nivel alto, su pregunta trata la diferencia entre objetos y tipos. Si bien hay muchos automóviles (objetos), solo hay una clase de automóviles (tipo). Declarar algo como estático significa que está operando en el espacio "tipo". Sólo hay uno. La palabra clave de clase de nivel superior ya define un tipo en el espacio "tipo". Como resultado, el "automóvil de clase estática pública" es redundante.
fuente
La clase con constructor privado es estática.
Declara tu clase así:
y puedes usar sin inicialización:
fuente
static class
declaración en C #), el compilador ni siquiera permitirá que el código declare variables de ese tipo, ni lo usará como un parámetro de tipo genérico. La mera falta de constructores accesibles en una clase que de otro modo podría ser instanciada o heredada no impediría la declaración de variables de ese tipo, ni su uso como parámetro de tipo genérico.Claro que pueden, pero solo clases anidadas
internas. Allí, significa que las instancias de la clase anidada no requieren una instancia de cierre de la clase externa.Pero para las clases de nivel superior, los diseñadores de idiomas no podían pensar en nada útil que hacer con la palabra clave, por lo que no está permitido.
fuente
static
, a veces tiene sentido poder hacerlo. Por ejemplo, una clase que contiene solo métodos auxiliares estáticos no tiene sentido ser instanciada, pero el lenguaje Java no le impide hacerlo. Puede hacer que la clase no sea instanciable (y prácticamente 'estática') para otras clases declarando el constructor predeterminadoprivate
, que prohíbe la creación de instancias porque no hay ningún constructor visible.Puede crear una clase de utilidad (que no puede tener instancias creadas) declarando un tipo de enumeración sin instancias. es decir, usted declara específicamente que no hay instancias.
fuente
... se puede declarar estático, siempre que sea una clase miembro.
De la JLS:
y aquí:
Una palabra clave estática no tendría ningún sentido para una clase de nivel superior, solo porque una clase de nivel superior no tiene un tipo cerrado.
fuente
Inner
?Nested
habría sido una opción menos confusa.Como se explicó anteriormente, una clase no puede ser estática a menos que sea miembro de otra clase.
Si está buscando diseñar una clase "de la cual no puede haber múltiples instancias", es posible que desee examinar el patrón de diseño "Singleton".
Principiante Singleton información aquí .
Consideración:
fuente
Además de cómo Java define las clases internas estáticas, existe otra definición de clases estáticas según el mundo C # [1] . Una clase estática es aquella que solo tiene métodos estáticos (funciones) y está destinada a admitir programación de procedimientos. Tales clases no son realmente clases en el sentido de que el usuario de la clase solo está interesado en las funciones auxiliares y no en crear instancias de la clase. Si bien las clases estáticas son compatibles con C #, no existe tal soporte directo en Java. Sin embargo, puede usar enumeraciones para imitar las clases estáticas de C # en Java para que un usuario nunca pueda crear instancias de una clase determinada (incluso usando la reflexión) [2] :
fuente
Todo lo que codificamos en Java entra en una clase. Cada vez que ejecutamos una clase, JVM crea una instancia de un objeto. JVM puede crear varios objetos, por definición Estático significa que tiene el mismo conjunto de copias para todos los objetos.
Por lo tanto, si Java hubiera permitido que la clase superior fuera estática cada vez que ejecute un programa, crea un Objeto y continúa anulando en la misma Ubicación de memoria.
Si solo reemplaza el objeto cada vez que lo ejecuta, ¿cuál es el punto de crearlo?
Esa es la razón por la que Java se deshizo de la estática para la clase de nivel superior.
Puede haber razones más concretas, pero esto tiene mucho sentido lógico para mí.
fuente
Las únicas clases que pueden ser estáticas son las clases internas. El siguiente código funciona bien:
El punto de las clases internas estáticas es que no tienen una referencia al objeto de la clase externa.
fuente
¡Creo que esto es posible tan fácil como tomar un vaso de café !. Solo mira esto. No usamos palabras clave estáticas explícitamente al definir la clase.
¿No es eso una definición de clase estática? Solo usamos una función ligada a solo una clase. Tenga cuidado de que en este caso podamos usar otra clase en esa anidada. Mira esto:
fuente
new StaticClass()
y eso no tiene mucho sentido. Con un constructor privado no permitiría instancias de este.En
PlatformUI
Eclipse se puede ver una clase con métodos estáticos y un constructor privado en sí mismo que es final.fuente
Si el beneficio de usar una clase estática no es crear una instancia de un objeto y usar un método, entonces simplemente declare la clase como pública y este método como estático.
fuente