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