这部分代码是什么?

时间:2011-05-25 06:09:12

标签: java override runnable

我有一些代码通过使用Runnable接口来演示线程的使用。 我从一个网站的代码开始,并根据自己的喜好修改它。它有效,但我不明白它的一部分。 我试图将代码剥离到我所要求的本质,但我可能已经花了太多。我在NetBeans中的代码工作,所以这是工作代码,除非我把错误的东西搞砸了。 但是让我问一下我的问题,看看是否可以回答: 我不明白的部分是这部分:

public String toString()
       {
return "Thread " + Thread.currentThread().getName() + ": " + countDown;
       }

在最长的时间里,这就像一个成员变量,它的名称在运行时动态设置,等于当前线程的名称。但是我也在不止一个地方读到你不能用Java动态命名变量,所以我猜这不是我正在看的东西。 然后,我意识到NetBeans希望我在此代码部分之前放置@Override,因为某些内容正在被覆盖。但我不明白究竟是什么被覆盖。我是否重写了某些父类的构造函数?如果是这样,什么课?

无论如何,这是代码:

package countdown;

public class Counter implements Runnable
{
private int countDown = 5;
public String toString()
       {
return "Thread " + Thread.currentThread().getName() + ": " + countDown;
       }


public void run()
    {
   while(true) {
  System.out.println(this);
  if(--countDown == 0)
                      {
return;
                      }
                }
    }
}
package countdown;

public class Main 
{

public static void main(String[] args)
    {
for(int i = 1; i <= 5; i++)
  new Thread(new Counter(), "" + i).start();
    }

}

2 个答案:

答案 0 :(得分:1)

好的,那就是你要覆盖Object.toString()方法,它总是返回命名类的一些字符串表示。所有它正在组成一个像

这样的字符串
"Thread XXX: 5"

在Java中,您始终可以覆盖父类(非最终)方法; @Override标记只是帮助提示工具。但它没有设置任何内容的名称:它创建一个新的匿名字符串,并返回其引用。

如果您在toString()上调用标准Thread,则会收到类似“&lt; #Thread 2348564&gt;”的字符串或同样有用的东西;现在,对于本课程,您将获得有用的信息。

答案 1 :(得分:1)

每个类都实现toString( ),因为它由Object定义。但是,toString( )的默认实现很少。

对于您创建的大多数重要类,您需要覆盖toString( )并提供自己的字符串表示形式。幸运的是,这很容易做到。 toString( )方法具有以下一般形式:

String toString( )   

当在toString()方法中传递对象引用时,会自动调用对象的System.out.println()方法。


@Override用作读者的文档,并在编译器中进行双重检查。 使用@Override注释指示方法正在覆盖基类中的另一个方法。

例如

@Override
public String toString()
       {
return "Thread " + Thread.currentThread().getName() + ": " + countDown;
       }

请参阅:When do you use Java's @Override annotation and why?