2012-06-16 18 views
5

? Tengo entendido que los miembros estáticos pertenecen a la clase. ¿Por qué entonces Java me permite acceder a ellos con un objeto?¿Por qué Java permite el acceso de un miembro estático con una instancia de objeto

Para entender lo que quiero decir, por favor ver el siguiente ejemplo:

public class Student { 
    public static int number = 0; 
} 

Aquí number es un campo estático que pertenece a la clase Student, pero todavía se puede acceder a él, como se muestra a continuación:

Student s = new Student(); 
int n = s.number; 

¿Cuál es la razón de ser de esta decisión?

+0

Traté de editar su pregunta para mayor claridad pero no pude. No puedo entender lo que estás preguntando? –

+2

Me rendí en "first blood" –

+1

Google Translate en su mejor momento :) – buc

Respuesta

7

La razón detrás de esto es que un objeto es una instancia de la clase y, por lo tanto, debe poder acceder a cada atributo que pertenece a la clase además de los atributos de nivel de instancia.

Es como el correo tradicional. Si recibe un correo dirigido a toda su familia (miembro estático), se sentirá con licencia para abrirlo, porque usted es el miembro de la familia. Por otro lado, si el correo está dirigido a usted (miembro de la instancia), solo usted tiene derecho a abrirlo, nadie más en su familia.

Esto también funciona igual en otros lenguajes orientados a objetos, como C++. Sin embargo, se desaconseja utilizar la notación s.number para acceder a los miembros estáticos, ya que es engañosa para los lectores de su código. Siempre debe usar la notación Student.number, ya que esto muestra claramente que number es un miembro estático. Los lenguajes modernos, por ejemplo C# emitirán una advertencia si accede a los miembros estáticos a través de la variable de instancia, pero aún así es perfectamente legal según las especificaciones del idioma.

+0

Gracias por su respuesta, ha perdido mi rompecabezas. Bazo uso C#, así que tengo esto. – Myd

0

La razón detrás de esto es ... JLS - Chapter 8.3.1.1. static Fields

+4

No veo ningún motivo per se en el JLS: simplemente el hecho de que puede acceder a él en un objeto. –

+0

+1 de referencia. Es una elección que hicieron al diseñar el idioma. – dacwe

+1

Tiene usted razón, no es un razonamiento per se. La pregunta original preguntó por qué pudo hacer esto. Así que creo que el enlace podría ser útil. – Behe

4

Después de leer un poco al parecer el compilador de Java que hace el Hoodoo necesario para hacer frente a instancias de objetos que tienen acceso a las variables estáticas y sabe lo que quiere que quería decir .. IDE darán que una advertencia sobre esto ..

en cuanto a la razón por la explicación y leyeron: Why isn't calling a static method by way of an instance an error for the Java compiler?

en última instancia es una especificación de lenguaje y sólo tiene que lidiar con ella .. su llamada si se debe utilizar o no. . Mi sugerencia: ¡NO!

Cuestiones relacionadas