java匿名内部クラスの説明とマルチスレッドの実現

4832 ワード

原文:http://tjukk.iteye.com/blog/2047663
匿名の部類、つまり名前のない部類です。
名前がないからこそ、匿名の内部クラスは一回しか使えません。コードの作成を簡略化するためによく使われます。
しかし、匿名の内部クラスを使用するには、父親のクラスを引き継ぐ必要があります。またはインターフェースを実現する必要があります。
 
実例1:匿名の内部クラスを使用せずに抽象的な方法を実現する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16abstract  class  Person {    public  abstract  void  eat();}  class  Childextends  Person {    public  void  eat() {        System.out.println("eat something");    }}  public  class  Demo {    public  static  void  main(String[] args) {        Person p = new  Child();        p.eat();    }}運転結果:eat something
私たちはChildでPersonクラスを継承し、Childの一例を実現し、それをPersonクラスの引用に変換することができる。
しかし、ここのChild類は一回しか使わないと、独立したカテゴリーにするのは面倒ではないですか?
この時は匿名の部類が導入されました。
 
実例2:匿名内部クラスの基本的な実現
1
2
3
4
5
6
7
8
9
10
11
12
13
14abstract  class  Person {    public  abstract  void  eat();}  public  class  Demo {    public  static  void  main(String[] args) {        Person p = new  Person() {            public  void  eat() {                System.out.println("eat something");            }        };        p.eat();    }}運転結果:eat something
抽象的なPersonの中の方法を直接大括弧で実現したことが見られます。
これにより、一つの種類の表記を省略することができます。
また、匿名の内部クラスは、インターフェース上で使用されてもよい。
 
例3:匿名の内部クラスをインターフェース上で使用するinterface  Person {    public  void  eat();}  public  class  Demo {    public  static  void  main(String[] args) {        Person p = new  Person() {            public  void  eat() {                System.out.println("eat something");            }        };        p.eat();    }}運転結果:eat something
 
上記の例から分かるように、1つのクラスが抽象的または1つのインターフェースである限り、そのサブクラスの方法は匿名の内部クラスを使用して実現されてもよい。
多くのスレッドを実現するためには、Threadクラスを継承したり、Runnableインターフェースを継承したりする必要があります。
 
実例4:Thread類の匿名内部クラスの実現
public class Demo {
		public static void threadMethod(String name){
			 Thread t = new Thread(name) {
		            public void run() {
		                for (int i = 1; i <= 5; i++) {
		                   System.out.print(Thread.currentThread().getName()+":"+i + "   ;   ");
		                }
		            }
		        };
		        t.start();
		}
	    public static void main(String[] args) {
	    	threadMethod("  1");
	    	threadMethod("  2");
	    }
	        
	}
運転結果(不確定):スレッド1:1  ;   スレッド1:2  ;   スレッド1:3  ;   スレッド2:1  ;   スレッド1:4  ;   スレッド2:2  ;   スレッド1:5  ;   スレッド2:3  ;   スレッド2:4  ;   スレッド2:5  ;   
 
実例5:Runnableインターフェースの匿名内部クラス実装
public class Demo {
		public static void threadMethod(){
			Runnable r = new Runnable() {
	            public void run() {
	                for (int i = 1; i <= 5; i++) {
	                    System.out.print(Thread.currentThread().getName()+":"+i + "   ;   ");
	                }
	            }
	        };
	        Thread t1 = new Thread(r, "  1");
	        Thread t2 = new Thread(r, "  2");
	        t1.start();
	        t2.start();
	    }
	    public static void main(String[] args) {
	    	threadMethod();
	    }
	        
	}
運転結果(不確定):スレッド1:1  ;   スレッド2:1  ;   スレッド1:2  ;   スレッド2:2  ;   スレッド1:3  ;   スレッド2:3  ;   スレッド1:4  ;   スレッド2:4  ;   スレッド2:5  ;   スレッド1:5  ;