实例化 Thread 之间有什么区别(如果有的话)
SomeThread t = new SomeThread();
t.start();
并且像这样:
new SomeThread().start();
类SomeThread 中的构造函数是否仍会被实例化?
或者它实际上是否第二次跳过实例化构造函数并直接进入 run() - 方法?
注意:类 SomeThread 扩展了Thread
答案 0 :(得分:6)
new关键字用于创建对象,您仍在调用构造函数,正如您可以看到 SomeThread()的调用。上面的两个代码示例是等效的。
答案 1 :(得分:3)
或者它实际上是否第二次跳过实例化构造函数......?
在两种情况下都会调用构造函数并初始化实例。不同之处在于无法重用第二个示例中创建的实例。
要使它们等效,您需要将该实例保存到变量中:
SomeThread t;
(t = new SomeThread()).start();
...直接进入
run()
方法?
run
方法是一个实例方法,因此要调用它,您必须在已定义的对象上调用此方法。
答案 2 :(得分:2)
除了第一种情况保持对变量的引用之外没有区别。构造函数始终在您创建实例时运行。
答案 3 :(得分:2)
两个方法都调用构造函数并实例化对象。区别在于您在第二种情况下跳过实例化对象的变量赋值。
您可以通过让构造函数产生一些副作用(例如打印到std out)(例如下面打印两次)来轻松测试它。
package com.example;
public final class ThreadTest {
public static void main(String[] args) {
SomeThread thread1 = new SomeThread();
thread1.run();
new SomeThread().run();
}
public static final class SomeThread extends Thread{
public SomeThread() {
System.out.println("called");
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
}
}
}
当您不在代码中使用变量时,两种方法之间没有真正的区别。