1

我有一些代码通过使用 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();
    }

}
4

2 回答 2

1

好的,您正在覆盖该Object.toString()方法,该方法总是返回命名类的一些字符串表示形式。它所做的只是组成一个字符串

"Thread XXX: 5"

在Java中,你总是可以覆盖一个父类(非final)的方法;该@Override标签只是对工具有用的提示。但它没有设置任何东西的名称:它创建一个新的匿名字符串,并返回它的引用。

如果你调用 standard toString()on Thread,你会得到一个类似 "<#Thread 2348564>" 或同样有用的字符串;现在,对于这门课,您将获得有用的信息。

于 2011-05-25T06:14:04.807 回答
1

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

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

String toString( )   

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


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

例如

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

请参阅:您何时使用 Java 的 @Override 注释以及为什么?

于 2011-05-25T06:16:08.707 回答