2011-09-08 19 views
31

Esto podría ser simple para los desarrolladores de Java experimentados, pero parece que no puedo resolverlo. Leí una publicación desde aquí. El código eraMétodos de anulación de Java al crear una nueva instancia de una clase

View v = new View(this) { 
    @Override 
    protected void onDraw(Canvas canvas) { 
     System.out.println("large view on draw called"); 
     super.onDraw(canvas); 
    } 
}; 

Era una pregunta de Android. Aquí el usuario crea una instancia de una vista y anula un método en una sola línea. ¿Hay algún nombre para este tipo de codificación?

Mi segunda duda es que reemplaza un método protegido de otro paquete. No es el paquete de medios protegidos privado. Sé que esto funcionará cuando lo probé, pero no pude entender por qué funcionó. Entonces, ¿por qué está funcionando este código?

Intenté googlear esto y buscar en SO antes de preguntar, pero no pude encontrar una respuesta.

Respuesta

18

protected significa (aproximadamente) "disponible para subclases". (Consulte this table.) Dado que new View(this) { ... } crea una subclase, es posible anular el método dentro de ella.

En este caso, no importa que se encuentre en un paquete diferente. (Consulte la línea protected y la segunda columna en this table). El hecho de que el método se encuentre en una subclase es suficiente para "obtener acceso" a un método protegido.


Potencial pregunta de seguimiento: ¿Qué sentido tiene, si me no puedo llamar al método de todos modos?

Todos los métodos en Java son virtual. Esto significa que siempre que la clase View realice una llamada aparentemente interna al método onDraw, esta llamada se enviará al método reemplazado.

+0

La clase I se olvidó de acceso predeterminado y el acceso protegido. Pero no estaba al tanto de la clase anónima. Gracias. – blessenm

9

Eso no es exactamente un tipo de codificación. Esa es una clase anónima de Java. Es muy común en Android y en general con oyentes de eventos y ese tipo de cosas.

Para más detalles se puede leer this link (probablemente no es el mejor):

Las clases internas anónimas es muy útil en algunas situaciones. Para el ejemplo , considere una situación en la que necesite crear la instancia de un objeto sin crear la subclase de una clase y también realizar tareas adicionales, como la sobrecarga de métodos.

Sobre su segunda pregunta, la palabra clave protected significa que el método sólo está disponible para las subclases, por lo que es posible reemplazar el método.

+0

No tenía conocimiento de las clases anónimas en java. Gracias por el enlace y la explicación. +1 voto. – blessenm

3

Esta es una clase anónima. Tiene razón en que está anulando un método protegido y esto es perfectamente normal. Un método protegido es visible, y por lo tanto puede ser anulado, por una subclase, que es lo que ha creado aquí.

El paquete protegido es el alcance predeterminado cuando no proporciona un alcance para su variable o método. Eso es diferente a protegido.

1

Al igual que otros aquí ya se respondieron, esto se denomina clase anónima, y ​​la anulación de métodos protegidos es legal ya que los métodos protegidos son visibles para las clases secundarias y las clases en el mismo paquete.

1

Tantas answeres estaban allí para "protegido", por lo que voy a otro :)
@ Override se informa al compilador para reemplazar el método de la clase base, y si no hay un método de la clase base de esta firma a continuación, arroja un error de compilación.

Estos se llaman anotaciones. Puede buscar el tema de anotaciones en java. Puede crear anotaciones personalizadas también.

Saludos,
SSuman185

Cuestiones relacionadas