2010-11-28 58 views
5

我目前正在学习Java课程,并遇到一些令人困惑的代码。Java可运行问题

例子:

Runnable runnable = new Runnable() 
     { 
      public void run() 
      { 
       //doStuff 
      } 
     }; 

我真的不明白这是什么代码正在做什么。

run方法如何与一个类的实例关联?

我搜索了一下“Runnable”,发现它是一个接口。我是通过在大括号之间声明run方法来实现接口吗?这可以在java中的任何接口完成吗?

我可以使用一些链接/解释。谢谢!

+2

+1猜测发生了什么事情。从你已经知道的逻辑上推断是发展的核心技能。 – SLaks 2010-11-28 22:25:26

回答

8

这是一个匿名内部类这是实现接口Runnable。是的,你可以用这种方式实现任何接口,尽管在任何情况下你会或不会有这样的理由(缺乏可重用性在“不会”列中是很大的一个)。更多关于匿名类here,但它基本上这是一个方便的形式:

// Define it 
class Foo implements Runnable 
{ 
    public void run() 
    { 
     // Do stuff 
    } 
} 

// And then use it 
Runnable runnable = new Foo(); 

...提供Foo是内(或“嵌套”)类。更多关于嵌套类here

2

是的,你通过声明运行来实现接口。是的,它可以为任何接口完成。

这通常是在将实现传递给期望接口类型参数的方法并且没有适当的声明类时完成的。你可以在现场实现接口,并运行代码。很简约。

2

我搜索了一下“Runnable”,发现它是一个接口 。我在 执行界面通过 声明方括号之间的曲线 ?这可以在java中的任何 接口完成吗?

是的!

此代码正在实例化一个实现Runnable的对象。因为我们实际上不能构造一个接口,所以任何试图这样做的代码都必须在大括号中提供接口方法的实现。我们并没有真正了解Java创建的实现Runnable的类(这些是抽象的术语)。

如果你要做到以下几点:

Runnable runnable = new Runnable() 
     { 
      public void run() 
      { 
       System.out.println("I'm running"); 
      } 
     }; 
runnable.run(); 

您将看到“我跑”作为输出。

0

在某些情况下,此示例代码将是有益的.... test runna = new test()

class test implements Runnable{ 
     test(){ 
      Thread t = new Thread(this); 
      t.start(); 
     } 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while(true){ 
       try { 
        Thread.sleep(3000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       System.out.print("asd"); 
      } 
     } 

    }