看到毕老师的第十二天的最后个视频,开发中常用创建多线程的几种方式,其中有一种是通过匿名内部类创建的,想到毕老师之前讲的接口是不可能创建对象的,因为有抽象方法。需要被子类实现(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();
作者: 王德升 时间: 2012-6-30 10:43
这个是匿名内部类,因为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();
就可以了。作者: 邓超军 时间: 2012-6-30 11:06
接口有两种使用方式:1、采用实现的方法;2、内部类的方法(这种方法可以理解为继承)
所以
new Runnable(){
}
是使用了内部类的方法,相当于继承。
Runnable r = new Runnable(){}是父类定义变量引用之类对象。作者: 孙飞 时间: 2012-6-30 18:28
毕老师讲的匿名内部类的格式:
new 父类或接口()
{
定义子类内容
}
这里只不过是给匿名内部类起了一个名字,还是内部类。注意()后面没有; 其实匿名内部类就是一个匿名子类对象,所以你这里等于是建立了一个父类Runnable引用的子类对象,所以}后面带有;的。作者: Forever。 时间: 2012-6-30 19:18
同学其实以后用的匿名内部类多了你也就习惯了,一开始我用这个的时候也困惑过。
匿名内部类我的理解实际上就是一个内部类没有名字; new Runnable();如果是这样是新建一个对象(显然对于Runnable是不行的)
new Runnable()
{
public void run()
{
for (int x = 0;x<80 ;x++ )
{
System.out.println(Thread.currentThread().getName()+"......"+x);
}
}
};