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

时间:2016-08-23 11:32:46

标签: java multithreading super

OwnerContribution oc = new OwnerContribution();
                oc.amount = 10;
                oc.comments = "Test Entry";
                oc.date = System.DateTime.Now;
                oc.paymentType = "Check";
                oc.referenceNumber = "12345";


Owner ow = new Owner();
      ow.ID = 12345;

LedgerItem[] li = new LedgerItem[1];
             li[0] = oc;

OwnerLedger owl = new OwnerLedger();
            owl.items = li;

OwnerLedger owl1 = client.appendOwnerLedgerItems(owl,ow); // This is where i get the cast error

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

2 个答案:

答案 0 :(得分:7)

super(name)new Thread(name);远程做同样的事情。

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

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

  

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

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

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

答案 1 :(得分:3)

如果您拨打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);
}