なぜ最初の方法は正しいのに、2番目の方法は正しくないのですか?
最初の方法:
new Object() {
public void a() {
/*code*/
}
}.a();
2番目の方法:
Object object = new Object() {
public void a() {
/*code*/
}
};
object.a();
また、それに関する詳細情報はどこで入手できますか?
Java.lang.Object
にはa
メソッドが宣言されていません(2)、匿名クラスは クラスインスタンス作成式new Object() { public void a() {} }
によって返されます(1)を行います。
Java 10's local variable type inference (var
)を使用して、2番目のオプションを最初のオプションと同じように有効にします。
var object = new Object() {
public void a() {}
};
object.a();
2番目のオプションでは、Object
型の参照に新しいオブジェクトを割り当てます。このため、その参照では_Java.lang.Object
_で定義されたメソッドのみを呼び出すことができます。
最初のオプションでは、基本的に_Java.lang.Object
_を拡張する匿名クラスの新しいオブジェクトを作成します。その匿名クラスには追加のメソッドa()
があり、これを呼び出すことができる理由です。
Javaは静的に型付けされます。 object.a()
と言うと、存在しないa
クラスでObject
メソッドを探しています。したがって、コンパイルされません。
以下に示すように、リフレクションを使用してobject
のメソッドを取得できます。
Object object = new Object() {
public void a() {
System.out.println("In a");
}
}
Method method = object.getClass().getDeclaredMethod("a");
method.invoke(object, null);
これは印刷されます
で
心配する必要はありません。少し修正する必要があります。どちらもクラスのプライベートメンバーにアクセスする方法です。最初の方法を使用すると、method.exを事前に宣言する必要がありません。
public class demo {
public static void main(String[] args) {
new Object() {
public void a() {
/*code*/
System.out.println("Hello");
}
}.a();
}
}
しかし、2番目の方法を使用すると、メソッドa()を明示的に宣言する必要があります。抽象クラスまたはインターフェースのいずれかで、それをオーバーライドできます。のような:-
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();
}
}
私はそれが少し役立つことを願っています。