web-dev-qa-db-fra.com

Déclarer une méthode lors de la création d'un objet

Pourquoi le premier moyen est correct, mais le second ne l'est pas?


Première manière:

new Object() {
    public void a() {
        /*code*/
    }
}.a();

Deuxième manière:

Object object = new Object() {
    public void a() {
        /*code*/
    }
};

object.a();

Et où puis-je trouver plus d'informations à ce sujet?

29
Sekonoishi Kamiki

Java.lang.Object n'a pas de méthode a déclarée (2), tandis que la classe anonyme renvoyée par l'expression de création d'instance de classenew Object() { public void a() {} } fait (1).

Utilisez l'inférence de type de variable locale de Java 10 (var) pour rendre la deuxième option aussi valide que la première.

var object = new Object() {
    public void a() {}
};
object.a();
43
Andrew Tobilko

Dans la deuxième option, vous affectez votre nouvel objet à une référence de type Object. De ce fait, seules les méthodes définies dans Java.lang.Object peuvent être appelées sur cette référence.

Et dans la première option, vous créez essentiellement un nouvel objet de classe anonyme qui étend Java.lang.Object. Cette classe anonyme a la méthode supplémentaire a(), c'est pourquoi vous pouvez l'appeler.

21
Ivan

Java est typé statiquement. Lorsque vous dites object.a(), il recherche la méthode a dans la classe Object qui n’est pas présente. Par conséquent, il ne compile pas.

Ce que vous pouvez faire est d’obtenir la méthode de object en utilisant la réflexion comme indiqué ci-dessous:

Object object = new Object() {
  public void a() {
     System.out.println("In a");
  }
}

Method method = object.getClass().getDeclaredMethod("a");
method.invoke(object, null);

Cela imprimerait 

Dans un

2
fastcodejava

Ne vous inquiétez pas, vous devrez faire un peu de correction Ce sont des moyens d'accéder au membre privé d'une classe. En utilisant la première manière, vous n'avez pas à pré-déclarer le fichier method.ex: -

public class demo {

    public static void main(String[] args) {
    new Object() {
        public void a() {
            /*code*/
            System.out.println("Hello");
        }
    }.a();

}

}

Mais en utilisant la seconde façon, vous devrez déclarer explicitement la méthode a (); soit en classe abstraite, soit en interface, vous pouvez le remplacer. comme: -

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();


}

}

J'espère que ça va aider un peu.

0
MAYANK