黑马程序员技术交流社区

标题: 为什么运行下面的run方法,而不运行runnable接口中的run方法 [打印本页]

作者: Cheers_for_CRAZ    时间: 2013-10-29 19:31
标题: 为什么运行下面的run方法,而不运行runnable接口中的run方法
本帖最后由 Cheers_for_CRAZ 于 2013-10-30 22:12 编辑

为什么运行下面的run方法,而不运行runnable接口中的run方法!哪位大神给个详细的解释!
public class ThreadTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                new Thread(new Runnable(){
                        public void run(){
                                for (int i = 0; i <50; i++) {
                                        System.out.println(Thread.currentThread().getName());
                                }
                        }
                }){
                        public void run(){
                                for (int i = 0; i <50; i++) {
                                        System.out.println("....."+Thread.currentThread().getName());
                                }
                        }
                }.start();
        }

}


作者: 零下五度的水    时间: 2013-10-29 19:44
new Thread(...)
这个相当于一个匿名Thread类实例,重写了run方法
new Thread(...) {...}
这个相当于之前那个的匿名子类实例,又重写了run方法
自然结果是跑子类的run方法
作者: ヅ飞飞    时间: 2013-10-29 20:15
本帖最后由 ヅ飞飞 于 2013-10-29 20:20 编辑

这问题挺有意思的,我的看法如下,如有错误和不足之处希望指正。
首先,这是个匿名内部类嵌套的问题,new Thread( new Runnble(){} ){}
其次要明确匿名内部类new的是子类对象。
那么先从里面入手:new Runnble(){ public void run(){} }:new了一个Runble子类对象并重写run方法。我们可以给其加个引用指向它便于分析,即:Runnble a =new Runnble(){ public void run(){} }。
所以外层可以写成new Thread(a){public void run(){}},(a指向的是实现了Runnble接口的类的对象。)即new了一个Tread类的子类对象重写run方法。.start()启动该线程并调用run方法。此时调用的一定是重写的run方法。
要注意的是:我们这样启动过线程:Tread t = new Tread(a); t.strart();(a是实现了Runnble接口的子类对象)这是毕老师讲的第二种启动方式,但new Thread(a){public void run(){}}这种匿名内部类的方式绝不是第二种启动方式。它是第一种启动方式,因为new Tread(a){}new的不是Tread类对象而 是Tread的子类对象,只不过该子类的构造方法是带参数的,但start方法启动它时调用的一定是自己的run方法。
作者: 汪洋大海    时间: 2013-10-29 23:02
为何要这么写?有什么用?
作者: To    时间: 2013-10-30 00:10
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2