【发布时间】:2016-04-20 12:45:54
【问题描述】:
在我们的一个 Java 项目中,我发现了以下用于启动线程的代码:
new WorkerThread(socket).start();
现在根据 Java 中的operator precedence 这是错误的!应该是:
(new WorkerThread(socket)).start();
现在我的问题:
为什么它仍然有效?有什么危险吗?
仅供参考,WorkerThread 的实现非常简单:
private class WorkerThread extends Thread
{
private Socket socket;
public WorkerThread(Socket socket)
{
super();
this.socket = socket;
}
@Override
public void run()
{
try
{
/* do stuff... */
}
catch (IOException e)
{
}
finally
{
socket.close();
}
}
}
【问题讨论】:
-
为什么根据运算符优先级调用错误?您创建一个新对象,然后调用 start 方法...
-
你从哪里听说这是错误的?
-
没有什么问题,完全有效,符合Java语法。
-
我是这里唯一一个在他的研究中听说过“词法分析”的人吗?
-
@chrset 不,但是您在 Mena 的答案中链接的文档会引起很多混乱,尤其是因为您似乎只验证了第三列中写的内容(
Level)但是不要记下最后一列 (Associativity) 中写的内容。总而言之,如果您调用构造函数,则后面的.没有更高的优先级。构造函数将返回对象的一个实例,并在此实例上调用后续方法。
标签: java multithreading