web-dev-qa-db-ger.com

Deklarieren einer Methode beim Erstellen eines Objekts

Warum ist der erste Weg richtig, aber der zweite nicht?


Erster Weg:

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

Zweiter Weg:

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

object.a();

Und wo finde ich weitere Informationen dazu?

29

Java.lang.Object hat keine a-Methoden deklariert (2), während die anonyme Klasse, die von dem Klasseninstanzerstellungsausdrucknew Object() { public void a() {} } zurückgegeben wird (1), dies tut.

Verwenden Sie die Inferenz local Variablentypen von Java 10 (var), um die zweite Option als die erste Option gültig zu machen.

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

In der zweiten Option weisen Sie Ihr neues Objekt einer Referenz vom Typ Object zu. Aus diesem Grund konnten nur in Java.lang.Object definierte Methoden für diese Referenz aufgerufen werden.

Bei der ersten Option erstellen Sie grundsätzlich ein neues Objekt einer anonymen Klasse, das Java.lang.Object erweitert. Diese anonyme Klasse hat die zusätzliche Methode a(), weshalb Sie sie aufrufen können.

21
Ivan

Java ist statisch geschrieben. Wenn Sie object.a() sagen, sucht es nach der Methode a in der Object-Klasse, die nicht vorhanden ist. Daher kompiliert es nicht.

Was Sie tun können, ist, die Methode von object mithilfe der Reflektion wie folgt abzurufen:

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

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

Das würde drucken 

In einem

2
fastcodejava

Machen Sie sich keine Sorgen, Sie müssen etwas korrigieren. __ Beide Möglichkeiten sind, auf das private Mitglied einer Klasse zuzugreifen. Mit first way müssen Sie die Methode nicht vorab deklarieren.

public class demo {

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

}

}

Wenn Sie jedoch die zweite Methode verwenden, müssen Sie die Methode explizit als a () deklarieren. Entweder in der abstrakten Klasse oder in der Schnittstelle können Sie es überschreiben. mögen: -

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


}

}

Ich hoffe es hilft ein bisschen.

0
MAYANK