Java – 方法sleep(int)未定义Thread类型
我收到一个错误:方法sleep(int)未定义Thread类型。 我认为sleep方法在Java中的Thread类中。
import java.util.Random; public class Thread implements Runnable { String name; int time; Random r = new Random(); public Thread(String s){ name = s; time = r.nextInt(999); } public void run() { try{ System.out.printf("%s is sleeping for %d\n", name, time); Thread.sleep(time); System.out.printf("%s is done", name); } catch(Exception e ) { } } }
你实现了自己的一个名为Thread
的类,并尝试在其上调用sleep
,这会失败,导致你的类中未定义sleep
。 你的类基本上影响了java的Thread
类。
以不同的方式打电话给你的class级( MyRunnable
,像MyRunnable
MyThread
或更好的MyRunnable)或直接调用java.lang.Thread.sleep()
。
它不在你的 Thread
类中。
由于您将类命名为Thread
,因此Java将查找Thread.sleep
。 如果你想要内置到Java中的函数,请尝试java.lang.Thread.sleep(time);
。
您的类名“Thread”与Java标准库中的Thread类冲突。 更改class级的名称,它将解决所有问题。
你得到这个的原因是你已经实现了自己的Thread类。 在你的课堂上没有睡眠方法。
一等奖是避免使用属于标准Java库的类名。
如果您坚持保留名称,请使用java.lang.Thread.sleep(…)指定您希望Java提供的Thread类。
完全限定Thread
因为你试图使用java.lang.Thread
,而不是你自己的。
问题是你的类名为Thread
,它没有sleep()
方法。 sleep方法在java.lana.Thread
,由您的类隐藏。
这个问题的答案已经发布了另一个类比。 它可能不是直接的答案,但可以帮助您消除混淆为什么应该避免重用平台类的名称,并且永远不要重用java.lang中的类名 ,因为这些名称会自动导入到任何地方。 程序员习惯于以不合格的forms看到这些名称,并自然地假设这些名称引用了java.lang
熟悉的类。 如果您重复使用其中一个名称,则非限定名称将在其自己的包中使用时引用新定义。
一个名称可用于引用不同包中的多个类。 以下简单的代码片段探讨了重用平台类名时会发生什么。 你觉得它做什么? 看它。 它重用java.lang
包中的String
类。 试一试。
package test; final class String { private final java.lang.String s; public String(java.lang.String s) { this.s = s; } @Override public java.lang.String toString() { return s; } } final public class Main { public static void main(String[] args) { String s = new String("Hello world"); System.out.println(s); } }
这个程序看起来很简单,如果有点令人厌恶。 未命名包中的String
类只是java.lang.String
实例的包装器。 程序似乎应该打印Hello world 。 但是,如果您尝试运行该程序,则发现您无法运行该程序。 VM会发出如下错误消息:
Exception in thread "main" java.lang.NoSuchMethodError: main
如果您使用的是NetBeans IDE,则只会阻止该程序运行。 您将收到消息未找到主要类 。
VM无法找到main
方法,因为它不存在。 虽然Main
有一个名为main
的方法,但它的签名错误。 main方法必须接受一个字符串数组的参数。 VM正在努力告诉我们的是Main.main
接受我们的String类的数组,它与java.lang.String
没有任何关系。
结论:如上所述,始终避免重用java.lang
包中的平台类名。