2008-10-20 17 views
9
  1. Cuando un objeto se crea una instancia en Java, lo que realmente sucede en la memoria?
  2. ¿Se incluyen copias de los constructores principales?
  3. ¿Por qué los miembros de datos ocultos se comportan de manera diferente a los métodos anulados cuando se realizan?

Entiendo las explicaciones abstractas que se suelen dar para hacerte usar estas cosas correctamente, pero ¿cómo es que la JVM realmente lo hace?Java instanciación

Respuesta

17

Cuando se instancia un objeto, sólo los datos no estático es en realidad "Creado", junto con una referencia a la tipo de objeto que lo creó.

Ninguno de los métodos se ha copiado.

La "Referencia" a la clase que la creó es en realidad una tabla de envío de punteros. Existe un puntero para cada método que está disponible para la clase. Los punteros siempre apuntan a la implementación "correcta" (usualmente la más baja/más específica en el árbol de objetos) del método.

De esta forma, si tiene una llamada de nivel superior a otro método, pero el otro método se ha reemplazado, se llamará al método reemplazado porque allí apunta el puntero de la tabla. Debido a este mecanismo, no debería tomar más tiempo llamar a un método anulado que uno de nivel superior.

Las variables de la tabla de puntero + miembro son la "Instancia" de una clase.

El problema variable tiene que ver con un mecanismo completamente diferente, "espacios de nombres". Las variables no son "subclasificadas" en absoluto (no entran en la tabla de envío), pero las variables locales o protegidas pueden ocultarse mediante variables locales. Todo esto lo hace el compilador en tiempo de compilación y no tiene nada que ver con las instancias de objeto de tiempo de ejecución. El compilador determina qué objeto realmente desea y coloca una referencia a eso en su código.

Las reglas de alcance generalmente son para favorecer a la variable "Más cercana". Cualquier cosa más alejada con el mismo nombre simplemente será ignorada (sombreada) a favor de la definición más cercana.

Para obtener un poco más específico sobre la asignación de memoria si está interesado: todos los "OBJETOS" se asignan en el "Heap" (En realidad algo increíblemente más eficiente y hermoso que un montón, pero el mismo concepto.) Las variables son siempre punteros: Java nunca copiará un objeto, siempre copia un puntero a ese objeto. Las asignaciones de puntero variable para los parámetros de método y las variables locales se realizan en la pila, pero aunque la variable (puntero) se crea en la pila, los objetos a los que apuntan todavía no se asignan en la pila.

Tengo la tentación de escribir un ejemplo, pero esto ya es demasiado largo. Si quieres que escriba un par de clases con una relación extendida y cómo sus métodos y datos afectan el código generado, puedo ... solo preguntar.

+0

¿Todavía está dispuesto a escribir un ejemplo? Si es así, entonces hágalo. – Touchstone

0
  1. Se asigna memoria del montón para mantener todas las variables de instancia y los datos específicos de la implementación del objeto y itssuperclasses. Los datos específicos de implementación incluyen punteros a los datos de clases y métodos.

  2. Las variables de instancia de los objetos se inicializan con sus valores por defecto.

  3. El constructor de la clase más derivada se invoca. Lo primero que hace un constructor es llamar al constructor para su mayúscula. Este proceso continúa hasta que se llame al constructor para java.lang.Object, ya que java.lang.Object es la clase base para todos los objetos en java.

  4. Antes de que se ejecute el cuerpo del constructor, todos los inicializadores de variables de instancia y bloques de inicialización se ejecutan. Entonces se ejecuta el cuerpo del constructor. Por lo tanto, el constructor para la clase base completa primero y el constructor para la clase más derivada completa el último.

+0

todo esto es el tipo de información interesante, pero tienden a pensar que las partes que no fueron cubiertos por la respuesta de Bill no responden a la pregunta tampoco. – chiccodoro

Cuestiones relacionadas