首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当初始化一个对象时,构造函数是如何工作的?

当初始化一个对象时,构造函数是如何工作的?
EN

Stack Overflow用户
提问于 2014-04-24 16:12:28
回答 7查看 983关注 0票数 14

这段代码的输出是7 20。

为什么先打印7,然后打印20?

代码语言:javascript
复制
public class Television 
{
    private int channel = setChannel(7);
    public Television(int channel) 
    {
        this.channel = channel;
        System.out.print(channel +"");
    }

    public int setChannel(int channel) 
    {
        this.channel = channel;
        System.out.print(channel + "");
        return channel;
    }

    public static void main(String args[])
    {
        new Television(20);
    }
}
EN

回答 7

Stack Overflow用户

发布于 2014-04-24 16:16:24

创建对象时,将创建其字段。您有一个类成员:

代码语言:javascript
复制
private int channel = setChannel(7);

当你这样做的时候:

代码语言:javascript
复制
new Television(20);

该字段被初始化,在调用构造函数之前调用setChannel,并从那里打印7。

将创建对象的所有字段,并使用提供的值(如果未指定值,则为默认值)填充这些字段。您可以将其视为实例的准备工作。在这些成员准备好并初始化之后,将调用构造函数。

有关详细信息,请参阅JLS

票数 15
EN

Stack Overflow用户

发布于 2014-04-24 16:21:11

因为这就是Java中的order of initialization。简而言之:

  1. Static members和blocks
  2. Contructor
票数 14
EN

Stack Overflow用户

发布于 2014-04-24 16:23:59

答案可以在Java Language Specification中找到

在将对新创建的对象的引用作为结果返回之前,将使用以下过程处理指定的构造函数以初始化新对象:

  1. 将构造函数的参数分配给此构造函数调用的新创建的参数变量。

  1. 如果此构造函数以显式调用(§8.8.7.1)同一类中的另一个构造函数(使用此函数)开始...

  1. ...如果此构造函数用于Object以外的类,则此构造函数将以显式或隐式调用超类构造函数(使用SUPER...)开始...

  1. Execute类的实例初始化器和实例变量初始化器,将实例变量初始化器的值赋给相应的实例变量,按照它们在类的源代码中以文本形式出现的从左到右的顺序。如果执行这些初始化器中的任何一个都会导致异常,则不会处理更多的初始化器,并且此过程会突然结束,但会出现相同的异常。否则,请继续执行步骤5。

  1. Execute此构造函数的主体的其余部分。如果该执行突然完成,则此过程也会因同样的原因突然完成。否则,此过程将正常完成。

总而言之,如果一个构造函数没有调用另一个构造函数(使用this),也没有调用任何超类构造函数(使用super),那么在执行构造函数的代码之前初始化实例变量。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23263369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档