web-dev-qa-db-ja.com

オブジェクトを作成するときにメソッドを宣言する

なぜ最初の方法は正しいのに、2番目の方法は正しくないのですか?


最初の方法:

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

2番目の方法:

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

object.a();

また、それに関する詳細情報はどこで入手できますか?

29

Java.lang.Object にはaメソッドが宣言されていません(2)、匿名クラスは クラスインスタンス作成式new Object() { public void a() {} }によって返されます(1)を行います。

Java 10's local variable type inferencevar)を使用して、2番目のオプションを最初のオプションと同じように有効にします。

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

2番目のオプションでは、Object型の参照に新しいオブジェクトを割り当てます。このため、その参照では_Java.lang.Object_で定義されたメソッドのみを呼び出すことができます。

最初のオプションでは、基本的に_Java.lang.Object_を拡張する匿名クラスの新しいオブジェクトを作成します。その匿名クラスには追加のメソッドa()があり、これを呼び出すことができる理由です。

21
Ivan

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

これは印刷されます

2
fastcodejava

心配する必要はありません。少し修正する必要があります。どちらもクラスのプライベートメンバーにアクセスする方法です。最初の方法を使用すると、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();


}

}

私はそれが少し役立つことを願っています。

0
MAYANK