2011-09-10 11 views
29

No se puede encontrar una respuesta satisfactoria en ninguna parte.¿Por qué una clase de nivel superior no puede ser estática en Java?

+9

Sin saber qué respuestas que has encontrado, es probable que sólo va a obtener respuestas más satisfactorias. – BoltClock

+0

@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

Respuesta

58

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.

+2

@barend .. ellos por qué el compilador se queja cuando agrego la palabra clave estática – ngesh

+1

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

+6

+1: 'enum' anidado son' static' y 'final' pero no puedes usar ninguno. –

2

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)

0

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? .

+1

¿Quiere sugerir que publicar un comentario aquí fue algo constructivo? –

0

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.

0

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.

2

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

  1. deben ser comunes a todos los objetos de la clase.
  2. Debe pertenecer a la clase y ser accesible por nombre de clase.
  3. 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?

  1. 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.
  2. 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.
  3. 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

Cuestiones relacionadas