java 匿名内部类说明 及其多线程实现继承Thread,实现Runnable
来源:互联网 发布:经济学 知乎 编辑:程序博客网 时间:2024/05/21 06:41
原文:http://tjukk.iteye.com/blog/2047663
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
实例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
由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承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 ;
---------------------------------------------------------------
ps:上面的继承Thread和实现Runnable是常用的
之前没写过多线程,也记一下下面的吧
package com;public class TestRunnable implements Runnable{private int i = 10;@Overridepublic void run() {System.out.println("TestRunnable class "+Thread.currentThread().getName()+":"+(--i));}public static void main(String[] args) {TestRunnable t1 = new TestRunnable();TestRunnable t2 = new TestRunnable();//执行出的结果的顺序不确定 变量i copynew Thread(t1).start();new Thread(t2).start();//执行出的结果的顺序不确定 变量i 共享/*new Thread(t1,"thread1").start();new Thread(t1,"thread2").start();*/}}
执行结果:
TestRunnable class Thread-1:9
TestRunnable class Thread-0:9
TestRunnable class Thread-0:9
/*
TestRunnable class thread2:9
TestRunnable class thread1:8
TestRunnable class thread1:8
*/
package com;public class TestRunnable1 implements Runnable{private int i = 10;@Overridepublic void run() {System.out.println("TestRunnable1 class "+Thread.currentThread().getName()+":"+(--i));}public static void main(String[] args) {TestRunnable t1 = new TestRunnable();TestRunnable1 t2 = new TestRunnable1();//执行出的结果的顺序不确定new Thread(t1).start();new Thread(t2).start();}}执行结果:
TestRunnable1 class Thread-1:9TestRunnable class Thread-0:9
0 0
- java 匿名内部类说明 及其多线程实现继承Thread,实现Runnable
- Java多线程 匿名内部类实现多线程
- Runnable匿名内部类实现线程
- 使用匿名内部类实现线程,new Thread(new Runnable(){}) 和 new Thread(){}
- Java 继承Thread和实现Runnable实现多线程的区别
- [置顶]Java中 实现多线程成的三种方式(继承,实现,匿名内部类)
- Java 多线程实现接口Runnable和继承Thread区别
- java多线程(继承Thread以及实现Runnable接口)
- Java 多线程实现接口Runnable和继承Thread区别
- Java多线程基础-2-简单继承Thread,实现Runnable例子
- Java 多线程实现接口Runnable和继承Thread区别 (2
- Java 多线程实现接口Runnable和继承Thread区别
- Java内部类+匿名内部类详解+内部类实现多重继承
- 多线程 继承Thread、实现Runnable 区别应用
- 匿名内部类实现接口,继承类
- 多线程之匿名内部类实现
- Java多线程实现接口Runnable和继承Thread区别(建议使用Runnable)
- java编程之线程,实现Runnable接口,匿名内部类的写法
- 通比牛牛
- chrome中如何debug呢?
- ubuntu 16.04 安装QT问题
- JVM自动内存管理
- onTouchEvent返回值的作用
- java 匿名内部类说明 及其多线程实现继承Thread,实现Runnable
- Permission denied (publickey).
- Objective-C中Delegate,Protocol与Interface的区别
- Junit4的注意事项
- 健身补充蛋白
- string::append
- 50个PHP程序性能优化的方法
- c/c++ 结束进程
- 项目中经验总结,问题记录和后期改善