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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余清兰 中级黑马   /  2012-6-30 10:34  /  1867 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余清兰 于 2012-7-2 10:07 编辑

看到毕老师的第十二天的最后个视频,开发中常用创建多线程的几种方式,其中有一种是通过匿名内部类创建的,想到毕老师之前讲的接口是不可能创建对象的,因为有抽象方法。需要被子类实现(implements),子类对接口中的抽象方法全都覆盖后,子类才可以实例化。但是这个代码里,new Runnable()、Runnable就是个接口,这不是在创建对象吗?是因为内部类没有名字就没法创建对象,要用接口来创建,然后{ }里的代码来实现这个接口,传给了接口后,这样就返回一个匿名子类的对象??有点不明白,大家是怎么理解的呢?
Runnable r = new Runnable()
  {
   public void run()
   {
    for (int x = 0;x<80 ;x++ )
    {
     System.out.println(Thread.currentThread().getName()+"......"+x);
    }
   }
  };
new Thread(r).start();

6 个回复

倒序浏览
这个是匿名内部类,因为Runnable是借口不能new,所以Runnable r接口的引用指向了子类的对象,
class InnerTest
{
        public static void main(String[] args)
        {
                Test.function().method();
        }
}


interface Inter
{
        void method();
}

class Test
{
        //补足代码。通过匿名内部类。
        /*
        static class Inner implements Inter
        {
                public void method()
                {
                        System.out.println("method run");
                }
        }
        */

        static Inter function()
        {
                return new Inter
                {
                        public void method()
                        {
                                System.out.println("method run");
                        }
                };
        }

}

你看看这里是不是也new Inter了,
你上面的还要调用start方法才可以开启线程,所以要new对象,但是接口不可以,
所以要用父类引用指向子类对象,也就是匿名内部类,r.start();
就可以了。

点评

r.start()?  发表于 2012-6-30 16:47
回复 使用道具 举报
接口有两种使用方式:1、采用实现的方法;2、内部类的方法(这种方法可以理解为继承)
所以
new Runnable(){
}
是使用了内部类的方法,相当于继承。
Runnable r = new Runnable(){}是父类定义变量引用之类对象。

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
毕老师讲的匿名内部类的格式:
new  父类或接口()
{
定义子类内容
}
这里只不过是给匿名内部类起了一个名字,还是内部类。注意()后面没有;      其实匿名内部类就是一个匿名子类对象,所以你这里等于是建立了一个父类Runnable引用的子类对象,所以}后面带有;的。
回复 使用道具 举报
同学其实以后用的匿名内部类多了你也就习惯了,一开始我用这个的时候也困惑过。
匿名内部类我的理解实际上就是一个内部类没有名字; new Runnable();如果是这样是新建一个对象(显然对于Runnable是不行的)
  new Runnable()
  {
   public void run()
   {
    for (int x = 0;x<80 ;x++ )
    {
     System.out.println(Thread.currentThread().getName()+"......"+x);
    }
   }
  };

而这样就是一个匿名内部类了,后面的大括号是你实现Runnable接口以后实现run方法的代码(这和普通类的道理是一模一样的)。
new Thread(r).start();
这里thread的构造里可以传入一个实现了runnable接口的对象,自然就把r给他就行了。r就是那个实现了runnable接口但是没有具体名字的那个类的对象。
回复 使用道具 举报
接口确实不能创建对象,但是匿名内部类既然实现了接口,就可以以接口的名字为类型,并在后面的大括号中实现接口中的抽象方法,这个有点特殊,如果不理解,硬背就好了,你这个问题不属于对多线程不理解,回头去看看前面的匿名内部类吧,那是面向对象里面的,好好看看,理解了匿名内部类再回来看多线程。
回复 使用道具 举报
王德升 发表于 2012-6-30 10:43
这个是匿名内部类,因为Runnable是借口不能new,所以Runnable r接口的引用指向了子类的对象,
class InnerT ...

不是要开启线程吗,?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马