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