2017-03-08 4 views
2

私はJavaプログラミングを開始しています。抽象クラスを知りました。私はあなたがサブクラスになるようにそれらを拡張する具体的なクラスを作成せずにインスタンス化できないことを知っています。しかし、私はこのコードを試してみると、本当に混乱してしまいました。抽象クラス 'メソッドの本体を持つインスタンス'

abstract class Communication{ 
    public void FirstMethod() 
    { 
     System.out.println("I am first method()\n"); 
    } 
} 

public class Main{ 
    public static void main(String[] args){ 
     Communication communication = new Communication() { 
     @Override 
     public void FirstMethod(){ 
      super.FirstMethod(); 
     } 
     }; 

     communication.FisrtMethod(); 
    } 
} 

出力は次のようになります。私は、最初の方法()しています。 私はそれを変更する場合:

Communication communication = new Communication() { 
     @Override 
     public void FirstMethod(){ 
      System.out.println("I've been called from Main"); 
     } 
     }; 

出力は次のようになります。私は、メインから呼ばれてきました。 これはインスタンス化の一種なのか、それとも何のコンセプトなのか、誰か説明してもらえますか?

+2

これは、いわゆる匿名の内部クラスです。 – ntalbs

+0

ntalbsが言ったように、これは '匿名の内部クラス 'です。クラスのインスタンスを作成し、最初のインスタンスを拡張する新しいサブクラスを実際に作成することなく、そのメソッドの一部をオーバーライドする場合に使用できます。主にリスナーで使用されています... – Yazan

+0

サイドノートとして、[機能インタフェース](https://docs.oracle.com/javase/8/docs/api/java/util)が使用されるようになりました。 /function/package-summary.html) – Aaron

答えて

4

これは

匿名クラス

定義と呼ばれる:クラス名なしで宣言 内部クラスは匿名の内部クラスとして知られています。

匿名の内部クラスの場合は、それらを同時に宣言してインスタンス化します。一般的に、クラスやインタフェースのメソッドをオーバーライドする必要があるときはいつでも使用されます。

1

匿名の内部クラスと呼ばれています。このようにして、インターフェイス名または抽象クラスを実装して、その名前を見つけたり、同時にインスタンス化したりする必要がなくなります。このコンセプトは、特定の実装を1回だけ使用する場合に便利です。

コンストラクトは、常にそのようになっています

new SomeClass() { 
    //implementation of methods 
}; 
0

。これは、匿名クラスとして知られています。匿名クラス定義では、コード内にクラス定義を提供することができ、正式な名前はありません。匿名クラス式には、クラス定義とインスタンス作成式があります。これは、抽象クラスに限らず、インターフェースや具象クラスにも適用されます。あなたも、この方法のarguments.Exampleに匿名クラスの表現を使用することができます

abstract class A { } 
// so the anonymous class expression is 

A a = new A() {// class definition }; 

// This will actually create an instance of a 
// class that extends the abstract class A 
// that java will create at run time 

例えば はCollections.sort()メソッドのコンパレータです。

Collections.sort(listOfValues,new Comparator<Value>(){ 
     public int compare(Value v1, Value v2){ 
     // method implemetation. 
     } 
    }) 
関連する問題