显式调用父构造函数时 java 中的 super() 行为
super() behaviour in java when calling parent constructor explicitly
class NewThread1 extends Thread{
NewThread1(String name){
super(name); //this line replaced by 'new Thread(name);'
System.out.println("child Thread:"+this);
}
}
public class ThreadCreationExtend {
public static void main(String[] args) {
new NewThread1("Thread1");
new NewThread1("Thread2");
}
}
output:child Thread:Thread[Thread1,5,main]
child Thread:Thread[Thread2,5,main]
output after replacement:
child Thread:Thread[Thread-0,5,main]
child Thread:Thread[Thread-1,5,main]
我正在尝试调用 Thread class 构造函数 Thread(String name) 而不是使用 super(name) 但是当我使用 new Thread(String name) 时输出会有所不同。请解释不同的输出。
是因为默认的超级构造函数吗?如果是这样,那么我如何在没有 super() 的情况下使用父构造函数 Thread(String name)?
如果您调用 new Thread(String name)
而不是 super(name)
,您将创建一个新的 Thread
对象(与您刚刚构造的 NewThread1
实例无关),并将 name
参数传递给它。因此,您的 NewThread1
实例在这种情况下具有默认名称(因为编译器隐式添加 super()
以调用 Thread
无参数构造函数。
NewThread1 (String name) {
new Thread(name);
System.out.println("child Thread:"+this);
}
与
相同
NewThread1 (String name) {
super(); // name is not passed to the super class constructor
new Thread(name);
System.out.println("child Thread:"+this);
}
super(name)
和 new Thread(name);
不会远程做同样的事情。
super(name)
调用当前实例的父构造函数,使其有机会在 subclass 开始初始化 its[ 的过程之前初始化它的实例部分=40=] 部分实例。
new Thread(name)
创建一个完全独立的新 Thread
,然后将其丢弃(因为您永远不会在任何地方保存结果)。这与您使用 new
的任何其他时间完全一样:您正在创建一个 new 对象,而不是调用您的 superclass 构造函数。
If so then how do i use the parent constructor Thread(String name) without super()?
你的 subclass 需要给 superclass 一个机会来做它的初始化。如果您不编写对 super(...)
的调用,Java 编译器将为您插入对 super()
的调用(无参数)。所以这个问题真的没有意义:在 Thread
subclass 中,你给 Thread
使用 super(...)
初始化的机会。您不为此使用 new Thread(...)
。
您 可以 在该代码中使用 new Thread
来创建一个全新的、单独的、独立的线程,就像您可以使用 new HashMap
创建一个新 HashMap
。但我非常怀疑你想要。这与您的 class 的 superclass 是 Thread
.
这一事实无关
class NewThread1 extends Thread{
NewThread1(String name){
super(name); //this line replaced by 'new Thread(name);'
System.out.println("child Thread:"+this);
}
}
public class ThreadCreationExtend {
public static void main(String[] args) {
new NewThread1("Thread1");
new NewThread1("Thread2");
}
}
output:child Thread:Thread[Thread1,5,main]
child Thread:Thread[Thread2,5,main]
output after replacement:
child Thread:Thread[Thread-0,5,main]
child Thread:Thread[Thread-1,5,main]
我正在尝试调用 Thread class 构造函数 Thread(String name) 而不是使用 super(name) 但是当我使用 new Thread(String name) 时输出会有所不同。请解释不同的输出。 是因为默认的超级构造函数吗?如果是这样,那么我如何在没有 super() 的情况下使用父构造函数 Thread(String name)?
如果您调用 new Thread(String name)
而不是 super(name)
,您将创建一个新的 Thread
对象(与您刚刚构造的 NewThread1
实例无关),并将 name
参数传递给它。因此,您的 NewThread1
实例在这种情况下具有默认名称(因为编译器隐式添加 super()
以调用 Thread
无参数构造函数。
NewThread1 (String name) {
new Thread(name);
System.out.println("child Thread:"+this);
}
与
相同NewThread1 (String name) {
super(); // name is not passed to the super class constructor
new Thread(name);
System.out.println("child Thread:"+this);
}
super(name)
和 new Thread(name);
不会远程做同样的事情。
super(name)
调用当前实例的父构造函数,使其有机会在 subclass 开始初始化 its[ 的过程之前初始化它的实例部分=40=] 部分实例。
new Thread(name)
创建一个完全独立的新 Thread
,然后将其丢弃(因为您永远不会在任何地方保存结果)。这与您使用 new
的任何其他时间完全一样:您正在创建一个 new 对象,而不是调用您的 superclass 构造函数。
If so then how do i use the parent constructor Thread(String name) without super()?
你的 subclass 需要给 superclass 一个机会来做它的初始化。如果您不编写对 super(...)
的调用,Java 编译器将为您插入对 super()
的调用(无参数)。所以这个问题真的没有意义:在 Thread
subclass 中,你给 Thread
使用 super(...)
初始化的机会。您不为此使用 new Thread(...)
。
您 可以 在该代码中使用 new Thread
来创建一个全新的、单独的、独立的线程,就像您可以使用 new HashMap
创建一个新 HashMap
。但我非常怀疑你想要。这与您的 class 的 superclass 是 Thread
.