que - objetos en java
Declarar un método al crear un objeto (4)
¿Por qué la primera forma es correcta, pero la segunda no?
Primera forma:
new Object() {
public void a() {
/*code*/
}
}.a();
Segunda forma:
Object object = new Object() {
public void a() {
/*code*/
}
};
object.a();
¿Y dónde puedo encontrar más información al respecto?
En la segunda opción, asigna su nuevo objeto a una referencia de tipo Object
. Debido a esto, solo los métodos definidos en java.lang.Object
podrían llamarse en esa referencia.
Y en la primera opción, básicamente creas un nuevo objeto de clase anónima que extiende java.lang.Object
. Esa clase anónima tiene el método adicional a()
, por lo que puede llamarlo.
Java se escribe estáticamente. Cuando dices object.a()
está buscando el método a
en la clase Object
que no está presente. De ahí que no se compile.
Lo que puedes hacer es obtener el método del object
utilizando la reflexión como se muestra a continuación:
Object object = new Object() {
public void a() {
System.out.println("In a");
}
}
Method method = object.getClass().getDeclaredMethod("a");
method.invoke(object, null);
Esto imprimiría
en un
No se preocupe, tendrá que hacer un poco de corrección. Ambas son formas de acceder al miembro privado de una clase. Al utilizar la primera forma, no tiene que declarar previamente el método .ex: -
public class demo {
public static void main(String[] args) {
new Object() {
public void a() {
/*code*/
System.out.println("Hello");
}
}.a();
}
}
Pero al utilizar la segunda forma, tendrá que declarar explícitamente el método a (); Ya sea en la clase abstracta o en la interfaz, puede anularlo. me gusta: -
interface Object
{
public void a();
}
class demo {
public static void main(String[] args) {
Object object = new Object() {
public void a() {
System.out.println("Hello");
}
}; object.a();
}
}
Espero que te ayude un poco.
java.lang.Object
no tiene a
método declarado (2), mientras que la clase anónima devuelta por la instancia de la clase creación expresión new Object() { public void a() {} }
hace (1).
Use la inferencia de tipo de variable local de Java 10 ( var
) para que la segunda opción sea tan válida como la primera.
var object = new Object() {
public void a() {}
};
object.a();