No se puede encontrar una respuesta satisfactoria en ninguna parte.¿Por qué una clase de nivel superior no puede ser estática en Java?
Respuesta
Todas las clases de nivel superior son, por definición, estáticas.
Lo que el static
se reduce a es que una instancia de la clase puede sostenerse por sí misma. O bien, al revés: una clase interna no estática (= clase interna de instancia) no puede existir sin una instancia de la clase externa. Como una clase de nivel superior no tiene una clase externa, no puede ser otra cosa que static
.
Porque todas las clases de nivel superior son estáticas, tener la palabra clave static
en una definición de clase de nivel superior no tiene sentido.
algo de código para jugar con:
public class Foo {
public class Bar {
// Non-static innner class
}
public static class Baz {
// Static inner class
}
}
public class Example {
public static void main(String[] args) {
new Foo(); // this is ok
new Foo.Baz(); // this is ok
new Foo.Bar(); // does not compile!
Foo f = new Foo();
Foo.Bar bar = f.new Bar(); //this works, but don't do this
}
}
puse el "pero no hacerlo" ahí porque es código diseño realmente feo. Las clases internas de instancias no deberían ser visibles fuera de la clase externa. Solo deben usarse desde dentro de la clase externa.
@barend .. ellos por qué el compilador se queja cuando agrego la palabra clave estática – ngesh
La palabra clave no tiene ningún valor, por lo que la omitieron. Creo que esta es una opción de diseño sobre legibilidad. Tiene la misma cosa con la palabra clave 'public' cuando define un método en una' interfaz' (es igual de inútil), pero en ese caso lo dejaron en. – Barend
+1: 'enum' anidado son' static' y 'final' pero no puedes usar ninguno. –
static
se pueden agregar clases anidadas de una interfaz, aunque esta es la predeterminada.
Creo que static
no se puede agregar a las clases de nivel superior porque inicialmente no había clases anidadas y no se podía agregar estática a ninguna clase.
Se agregó la clase anidada posterior y se podría agregar estática a las clases anidadas; sin embargo, hay una tendencia a no cambiar la sintaxis más de lo necesario para que no se agregue a las clases de nivel superior. (como no hubo necesidad/beneficio)
Bueno, supongo que no entiendes bien si deseas ver una palabra clave "estática" en una clase externa.
En resumen, ¿cómo va a usar la característica de estática en una clase exterior?
public class Outer
{
public static int x = 0 ;
}
Ahora vas a hacer Outer.x para acceder a la variable estática. Esto implicaría que x comparte un solo valor en todos los objetos de Outer.
Ahora que tenemos esa distancia, ¿de qué consecuencia sería la palabra clave estática en la clase Outer? .
¿Quiere sugerir que publicar un comentario aquí fue algo constructivo? –
Siempre 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. Así que, si la clase superior es estática, cada vez que ejecute un programa, creará un objeto y seguirá navegando hacia la misma ubicación de memoria.
no podemos declarar la clase externa (nivel superior) como estática porque palabra clave estática está diseñada para proporcionar memoria y ejecutar lógica sin crear objetos, una clase no tiene una lógica de valor directamente, por lo que la palabra clave estática no está permitida.
He dado la misma respuesta Why can't a Java class be declared as static?. Pero escribir de nuevo aquí
debemos definir como miembros estática que
- deben ser comunes a todos los objetos de la clase.
- Debe pertenecer a la clase y ser accesible por nombre de clase.
- No debería necesitar un objeto de clase para acceder a ellos.
Supongamos ahora que estamos definiendo una clase externa como estática y supongamos que podemos hacerlo. ¿Esto servirá para cualquier propósito o proporcionará alguna ventaja a un desarrollador o creará ambigüedad y complicaciones tanto para los desarrolladores como para los creadores de lenguaje? cheque
Vamos, definiendo una clase externa como estática servirá propósitos que hemos definido anteriormente o no?
- Cada clase ya es común a todos sus objetos y no es necesario que sea estática para estar disponible para todos sus objetos.
- Necesitamos un nombre de clase para acceder a sus miembros estáticos debido a que estos miembros son parte de la clase, mientras que una clase externa forma parte del paquete y que puede acceder directamente a la clase con sólo escribir package_name.class_name (similar a class_name.static_field_name), por lo nuevamente no hay necesidad de hacer lo que ya está allí por defecto.
- No necesitamos ningún objeto para acceder a una clase si está visible, simplemente podemos escribir package_name.class_name para acceder a ella. Y, por definición, una clase es un modelo para sus objetos y creamos una clase para crear objetos a partir de ella (la excepción siempre estará presente, por ejemplo, java.lang.Math), nuevamente no hay necesidad de definir una clase externa como estática.
De los puntos anteriores, podemos decir que los creadores de Java no habían permitido que una clase externa fuera estática porque no hay necesidad de hacerla estática. Permitir que la clase externa sea estática solo aumentará las complicaciones, la ambigüedad y la duplicidad. Leer más en Why An Outer Java Class Can’t Be Static
- 1. ¿Cómo refactorizar una clase interna estática a una clase de nivel superior en Eclipse?
- 2. ¿Por qué la interfaz solo se puede declarar en la clase de nivel superior?
- 3. ¿Por qué DialogFragment no puede ser una clase interna?
- 4. ¿Por qué una enum de Java no puede ser definitiva?
- 5. ¿Por qué variables de Java ThreadLocal ser estática
- 6. ¿Por qué una clase interna no estática no puede tener miembros estáticos (campos y métodos)?
- 7. ¿Por qué una estructura no administrada no puede ser miembro de una clase administrada?
- 8. En Java, ¿por qué una matriz no puede ser una variable de tipo vinculada, pero puede ser un comodín vinculado?
- 9. ¿por qué __getitem__ no puede ser classmethod?
- 10. ¿Por qué no hay una variable estática local en Java?
- 11. ¿Por qué una variable de miembro Object no puede ser definitiva y volátil en Java?
- 12. Los controles de contenido deben ser controles de nivel superior
- 13. Por qué tienen clase estática pública dentro de una clase
- 14. ¿Liberación de memoria estática? no, eso no puede ser correcto
- 15. Diferencia de nivel bajo: clase no estática con método estático vs. clase estática con método estático
- 16. ¿Por qué una estructura C# no puede ser heredada?
- 17. ¿Debería mi clase de sesión ser estática?
- 18. C# clase estática ¿por qué usar?
- 19. ¿Por qué NSWindow sin styleMask: NSTitledWindowMask no puede ser keyWindow?
- 20. ¿Puede una int ser nula en Java?
- 21. Por qué AccessViolationException no puede ser capturado por .NET4.0
- 22. ¿Por qué la clase de entidad en JPA no puede ser definitiva?
- 23. tipo Java no puede ser resuelto
- 24. Java: ¿Clase estática?
- 25. ¿Por qué no TextBox.Text en WPF puede ser animado?
- 26. Clase estática interna en Java
- 27. ¿Por qué el lado izquierdo de una tarea no puede ser una expresión de incremento?
- 28. ¿Por qué los campos de clase no pueden ser var?
- 29. El juego "Need for Speed Most Wanted" no puede ser controlado por la clase Java Robot
- 30. JAVA element.getElementsByTagName Restringir a nivel superior
Sin saber qué respuestas que has encontrado, es probable que sólo va a obtener respuestas más satisfactorias. – BoltClock
@BoltClock .. bueno encontré estas respuestas que me preguntaron el motivo de tal clase pero no el motivo por el que no pueden ser estáticas http://www.coderanch.com/t/515963/java-programmer-SCJP/ certificación/Class-can not-protected-or-static ... y http://www.coderanch.com/t/523014/java/java/Why-Class-cannot-declared-as .. y http: // descargar .oracle.com/javase/tutorial/java/javaOO/nested.html – ngesh