Pregunta Métodos de anulación de Java cuando se crea una nueva instancia de una clase


Esto puede ser simple para los desarrolladores experimentados de Java, pero no puedo entenderlo. Leí una publicación desde aquí. El código era

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

Fue 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 anula 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.


32
2017-09-08 11:54


origen


Respuestas:


protected significa (aproximadamente) "disponible para subclases". (Ver Esta mesa.) Desde el new View(this) { ... } crea una subclase, es posible anular el método dentro de ella.

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


Posible pregunta de seguimiento: ¿Qué sentido tiene, si yo no puede llamar al método de todos modos?

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


18
2017-09-08 11:56



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 puedes leer este enlace (probablemente no sea el mejor):

Las clases internas anónimas son muy útiles en alguna situación. por   ejemplo, considere una situación en la que necesita crear la instancia de   un objeto sin crear 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 solo está disponible para las subclases, por lo que es posible anular el método.


9
2017-09-08 11:56



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.


3
2017-09-08 11:58



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


1
2017-09-08 12:00



Tantos answeres estaban allí para "protegido", así que voy a otro :)
@override está informando al compilador que anule el método de la clase base, y si no hay un método de clase base de esta firma, arroja un error de compilación.

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

Saludos,
SSuman185


1
2017-09-08 12:09