2012-02-23 8 views
8

¿Dónde se define realmente el "súper"? [Cuando estamos usando super.someMethod()]. ¿Está definido como un campo en la clase java.lang.Object o en la clase java.lang.Class?¿Cómo se implementa Super en Java?

Cuando llamamos desde una subclase, super contiene la referencia a su superclase. De la misma manera, el super en superclase tiene referencia a su superclase [De esta forma hasta java.lang.Object]. Entonces, ¿cómo inyecta java las referencias de la superclase al campo "super" que nos permite llamar a los métodos de superclase?

¿Hay alguna bajo las implementaations campana como el siguiente:

Class current = this.getClass(); 
    Class parent = current.getSuperclass(); 
    System.out.println("name is =" + parent); 

Respuesta

2

super es una palabra clave específica de referencia a objetos que asciende a la jerarquía de objetos desde el objeto que realiza la llamada hasta que encuentra un objeto antecesor que tiene una firma o propiedad/campo de método coincidente. Consulte Java documentation.

15

super como this es una palabra clave. Tiene un significado en Java que no se refleja en el código de bytes de Java. Significa la implementación de mis clases principales (que podrían heredarse)

En el nivel de código de bytes llamará explícitamente al método para su clase principal.

+0

1 Secundo esto. En el código de bytes, no es diferente de una llamada a método estándar. – Jivings

+0

Tiene razón, en la medida en que es posible en el nivel de código de bytes violar reglas que el compilador impone y no llama a super() como lo primero en un constructor. Puede modificar el bytecode para hacer esto y la JVM lo ejecutará felizmente. –

1

¿Se define como un campo en la clase java.lang.Object o en la clase java.lang.Class?

No es un campo en absoluto.

super.someMethod() es un elemento sintáctico de Java que dice "llamar al método como se define en mi superclase".


OK, supongamos que hipotéticamente se era un campo. ¿Cuál sería su tipo? ¿A qué se referiría? Si se hubiera declarado como:

Class<ParentClass> super = ... // the relevant class object. 

continuación super.someMethod() no funcionaría porque:

  • Class no tiene ningún métodos definidos por el usuario, y
  • super.someMethod() tiene que ser una llamada a una método de instancia, y no estamos suministrando una instancia adecuada.

Por otro lado, si se hubiera declarado como:

ParentClass super = this; 

continuación super.someMethod() sería equivalente a this.someMethod() y debería llamar al método en esta clase, no el anulados sucesivamente.

+0

¿Existe alguna posibilidad de que el método getSuperClass() de la clase java.lang.Class se esté utilizando [es decir tal vez la reflexión de Java se esté usando debajo del capó para inyectar referencia] http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getSuperclass%28%29 –

+0

No. There no hay ninguna posibilidad de que eso esté sucediendo. –

2

No es un campo, es un language keyword.

Por supuesto, hay una referencia a la superclase en el nivel de JVM, pero en el nivel de Java solo puede acceder a ella a través de la palabra clave. La diferencia es que, de hecho, no se puede acceder a un método de superclase a través de una referencia; se necesita un soporte especial del compilador para hacerlo.Y, por supuesto, no hay super.super

0

Supongo que comenzará a escalar la cadena de los ancestros hasta que encuentre la primera clase que tiene el siguiente método super. Parece la manera más fácil. Esto se hace en tiempo de compilación si lo piensas. Al final, un método es solo un puntero de función, con un método de invocación que acepta la instancia en cuestión (en su caso es this). Mire la documentación Method.invoke

Será utilizada por el compilador con una instancia de método de la superclase y esto como la instancia de objeto

+0

Siempre llama a la superclase directa, por lo que no se requiere "escalada". Pero, obviamente, una clase hereda todos los métodos públicos/protegidos de sus padres, por lo que la diferencia radica principalmente en dividir cabellos (notará la diferencia al intentar llamar constructores por resolución de sobrecarga super y wrt) – Voo

+0

conceptualmente es como usted dice. Pero prácticamente el código no se repite, las subclases solo tendrán punteros a los métodos compilados de superclase. Lo quería decir porque estaba más interesado en la implementación. – gotch4

Cuestiones relacionadas