显式调用父构造函数时java中的super()行为

Ayu*_*h N 2 java multithreading super

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]
Run Code Online (Sandbox Code Playgroud)

我正在尝试调用Thread类构造函数,Thread(String name)而不是使用super(name),但是当我使用新的Thread(String name)输出时会有所不同.请解释不同的输出.是因为默认的超级构造函数吗?如果是这样,那我如何使用没有super()的父构造函数Thread(String name)?

T.J*_*der 7

super(name)并且new Thread(name);不要远程做同样的事情.

super(name)调用当前实例的父构造函数,使其有机会在子类启动初始化实例部分的过程之前初始化实例部分.

new Thread(name)创建一个完全独立的,新的Thread,然后抛弃它(因为你永远不会将结果保存在任何地方).它与您使用的任何其他时间完全一样new:您正在创建一个对象,而不是调用您的超类构造函数.

如果是这样,那我如何使用没有super()的父构造函数Thread(String name)?

您的子类需要为超类提供初始化的机会.如果不对调用进行编码super(...),Java编译器将为您插入对super()(无参数)的调用.所以这个问题没有意义:在Thread子类中,你给Thread它初始化的机会super(...).你没有用new Thread(...)它.

可以使用new Thread该代码创建一个全新的,独立的,独立的线程,就像你可以使用new HashMap创建一个新的HashMap.但我非常怀疑你是否愿意.这与你班级的超类这个事实无关Thread.