初始化对象时构造函数如何工作?

时间:2014-04-24 08:12:28

标签: java constructor

此代码的输出为7 20.

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

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);
    }
}

7 个答案:

答案 0 :(得分:15)

创建对象时,会创建其字段。你有一个班级成员:

private int channel = setChannel(7);

当你这样做时:

new Television(20);

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

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

有关更多详细信息,请参阅JLS

答案 1 :(得分:14)

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

  1. 静态成员和块
  2. 实例成员和块
  3. 构造体

答案 2 :(得分:6)

答案可在Java Language Specification

中找到
  

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

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

  2.   
  3. 如果此构造函数以同一类中另一个构造函数的显式构造函数调用(第8.8.7.1节)开头(使用此函数)...

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

  6.   
  7. 为此类执行实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值分配给相应的实例变量,按从而出现的从左到右的顺序在文本的源代码中。如果执行任何这些初始值设定项导致异常,则不会处理其他初始化程序,并且此过程会突然完成同样的异常。否则,请继续步骤5.

  8.   
  9. 执行此构造函数的其余部分。如果执行突然完成,则此过程突然完成,原因相同。否则,此过程正常完成。

  10.   

总结一下,如果构造函数没有调用另一个构造函数(使用this)并且它不调用任何超类构造函数(使用super),则在执行代码之前初始化实例变量构造函数。

答案 3 :(得分:5)

首先,初始化私有字段,然后调用构造函数。

所以输出是7 20。

在java中,实例化新对象时发生以下过​​程:

  • 对对象的所有私有字段进行评估。
  • 然后才会调用构造函数。

答案 4 :(得分:4)

你在类construsctor之外初始化你的字段'channel',所以在它之前调用这个初始化。

这是您拨打new Television(20)时附加的内容:

1/this.channel set to 7 (init step)
2/Calling constructor
3/this.chennel set to 20 (constructor code)

答案 5 :(得分:3)

因为首先调用变量通道初始化中的setChannel来初始化类,然后在构造函数中调用该方法。

答案 6 :(得分:3)

当您创建对象的实例时,首先要创建其数据成员(即首先执行该行private int channel = setChannel(7);),然后构造函数public Television(int channel) {...}才会创建该对象。