java匿名内部クラスの説明とマルチスレッドの実現
4832 ワード
原文:http://tjukk.iteye.com/blog/2047663
匿名の部類、つまり名前のない部類です。
名前がないからこそ、匿名の内部クラスは一回しか使えません。コードの作成を簡略化するためによく使われます。
しかし、匿名の内部クラスを使用するには、父親のクラスを引き継ぐ必要があります。またはインターフェースを実現する必要があります。
実例1:匿名の内部クラスを使用せずに抽象的な方法を実現する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
私たちはChildでPersonクラスを継承し、Childの一例を実現し、それをPersonクラスの引用に変換することができる。
しかし、ここのChild類は一回しか使わないと、独立したカテゴリーにするのは面倒ではないですか?
この時は匿名の部類が導入されました。
実例2:匿名内部クラスの基本的な実現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
抽象的なPersonの中の方法を直接大括弧で実現したことが見られます。
これにより、一つの種類の表記を省略することができます。
また、匿名の内部クラスは、インターフェース上で使用されてもよい。
例3:匿名の内部クラスをインターフェース上で使用する
上記の例から分かるように、1つのクラスが抽象的または1つのインターフェースである限り、そのサブクラスの方法は匿名の内部クラスを使用して実現されてもよい。
多くのスレッドを実現するためには、Threadクラスを継承したり、Runnableインターフェースを継承したりする必要があります。
実例4:Thread類の匿名内部クラスの実現
実例5:Runnableインターフェースの匿名内部クラス実装
匿名の部類、つまり名前のない部類です。
名前がないからこそ、匿名の内部クラスは一回しか使えません。コードの作成を簡略化するためによく使われます。
しかし、匿名の内部クラスを使用するには、父親のクラスを引き継ぐ必要があります。またはインターフェースを実現する必要があります。
実例1:匿名の内部クラスを使用せずに抽象的な方法を実現する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
abstract
class
Person {
public
abstract
void
eat();
}
class
Child
extends
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
14
abstract
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 ;