实例化新线程的方式是否有所不同?
Does the way of instantiating a new Thread make a difference?
像这样实例化 Thread 之间有什么区别(如果有的话)
SomeThread t = new SomeThread();
t.start();
像这样:
new SomeThread().start();
classSomeThread中的constructor还会被实例化吗?
或者它实际上跳过了第二次实例化构造函数并直接进入 运行()- 方法?
注:class SomeThread extends Thread
new 关键字用于创建对象,您仍在调用构造函数,正如您在 SomeThread() 的调用中看到的那样。以上两个代码示例是等价的。
除了第一种情况保留对变量的引用外,没有区别。创建实例时构造函数始终运行。
两种方法都调用构造函数并实例化对象。区别只是在第二种情况下您跳过了实例化对象的变量赋值。
您可以轻松地自行测试,方法是让构造函数产生一些副作用,例如打印到标准输出(例如,下面打印两次调用)。
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();
}
}
}
当您不在代码中使用变量时,这两种方法之间没有真正的区别。
Or does it actually skip instantiating the constructor the second time...?
两种情况下都会调用构造函数并初始化实例。不同之处在于无法重用第二个示例中创建的实例。
为了使它们等效,您需要将该实例保存到一个变量中:
SomeThread t;
(t = new SomeThread()).start();
... and go straight for the run()
method?
run
方法是实例方法,因此要调用它,您必须在已定义的对象上调用此方法。
像这样实例化 Thread 之间有什么区别(如果有的话)
SomeThread t = new SomeThread();
t.start();
像这样:
new SomeThread().start();
classSomeThread中的constructor还会被实例化吗?
或者它实际上跳过了第二次实例化构造函数并直接进入 运行()- 方法?
注:class SomeThread extends Thread
new 关键字用于创建对象,您仍在调用构造函数,正如您在 SomeThread() 的调用中看到的那样。以上两个代码示例是等价的。
除了第一种情况保留对变量的引用外,没有区别。创建实例时构造函数始终运行。
两种方法都调用构造函数并实例化对象。区别只是在第二种情况下您跳过了实例化对象的变量赋值。
您可以轻松地自行测试,方法是让构造函数产生一些副作用,例如打印到标准输出(例如,下面打印两次调用)。
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();
}
}
}
当您不在代码中使用变量时,这两种方法之间没有真正的区别。
Or does it actually skip instantiating the constructor the second time...?
两种情况下都会调用构造函数并初始化实例。不同之处在于无法重用第二个示例中创建的实例。
为了使它们等效,您需要将该实例保存到一个变量中:
SomeThread t;
(t = new SomeThread()).start();
... and go straight for the
run()
method?
run
方法是实例方法,因此要调用它,您必须在已定义的对象上调用此方法。