A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

new Thread(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Runnable-->run");
                    }
                }) {
                    @Override
                    public void run() {
                        System.out.println("Thread-->run");
                    }
                }.start();
先解释一下这个代码,可能有的同学已经忘了匿名内部类的使用和创建!
创建一个Thread的子类对象并重写Thread的run()方法,通过Thread的子类对象的构造方法传递一个Runnable接口的实现类对象并重写Runnable接口的run()方法!
输出结果是: Thread-->run
为什么执行的是Thread子类的run(),难道不应该是Runnable接口实现类对象的run()吗?
接下来看Thread的源码
public void run() {
        if (target != null) {
            target.run();
        }
    }

target哪来的呢,其实就是Thread的构造方法传递的Runnable接口的实现类对象,源码意思说如果传递的实现类对象不为空则调用实现类对象的run方法,那么为什么结果调用的却是Thread子类对象的run(),那是因为源码中有判断是否为空,不为空调用Runnable的run(),结果我们的代码是重写了Thread的run方法,所以执行的结果就是Thread的run方法!
接下来有个问题,如果是以下代码,执行的结果会是什么呢???
new Thread(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Runnable-->run");
                    }
                }) {
                    @Override
                    public void run() {
                        super.run();
                        System.out.println("Thread-->run");
                    }
                }.start();

有了对第一个案例的理解,这个就比较好理解了!
重写Thread的run()方法,并在第一行调用了父类的run();父类的run()是执行了Thread()的构造中传递过来的Runnable接口的实现类对象的run方法,所以先执行Runnable的run(),然后执行System.out.println("Thread-->run");
结果就是:
Runnable-->run   
Thread-->run



42 个回复

正序浏览
看着对自己很有帮助
回复 使用道具 举报
synchronize 发表于 2017-11-29 23:51
public class TestDemo {

        public static void main(String[] args) {

差不多,单独写类就是这样的
回复 使用道具 举报
写的真好 ,对我的学习非常有帮助
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
pyx0812 来自手机 初级黑马 2017-12-5 13:14:56
40#
第一遍看的时候居然看不太懂,看来应该好好复习一下啦
回复 使用道具 举报
不亏是大腿   没全看明白
回复 使用道具 举报
简单的说,Thread 传入了Runnable匿名对象时,重写Run方法,并作为覆盖自身run方法,而后创建匿名子类对象,又覆盖run方法
回复 使用道具 举报
每天复习一点点,掌握的就牢一些,又学到了,感谢
回复 使用道具 举报
刚学过的都忘记了,看了之后,算是复习也更是加深理解
回复 使用道具 举报
小鹿哥 来自手机 初级黑马 2017-12-2 23:54:53
35#
嗯?嗯?嗯?,一脸懵逼...
回复 使用道具 举报
两个匿名内部类,Runnable的内部类当做参数来传递,学到了
回复 使用道具 举报
回顾了以前的学的知识  虽然都快忘光了 还是很棒
回复 使用道具 举报
说的很棒 回顾了一下以前的学的知识 ,虽然都忘的快没了  现翻的笔记 看的
回复 使用道具 举报
回顾了一下以前学 的知识 很棒  虽然有些都快忘光了还带先翻一下笔记
回复 使用道具 举报
看了小明班长写的这个,感觉之前都是按照格式来巧代码,不过这个还真是看不太懂,尽管小明班长给讲了一遍,但是也只是知道一点点,想真的明明白白,感觉还不是一时半会儿的事啊
回复 使用道具 举报
现在看这个有些费劲 可能是那时候记得不够扎实 ,思路有点绕,勉强能够看懂!!!!!
回复 使用道具 举报
爱奋斗的桃花侠 来自手机 初级黑马 2017-12-2 21:29:08
28#
子类重写父类方法后创建子类对象调用的当然是子类重写的法啊。。。
回复 使用道具 举报
synchronize 发表于 2017-11-29 23:51
public class TestDemo {

        public static void main(String[] args) {

看到大神写的东西,才知道差距这么大,还是得好好学习啊,勤复习,多练习,少扯皮,争取紧跟大神步伐!!!
回复 使用道具 举报
加油!很棒
回复 使用道具 举报
有点没明白啊,是两个内部类吧,那是不是thread后还应该有一个小括号啊?
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马