此代码的输出为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); } }
Maroun.. 15
创建对象时,将创建其字段.你有一个班级成员:
private int channel = setChannel(7);
当你这样做时:
new Television(20);
该字段初始化并setChannel
在调用构造函数之前调用,并从那里打印7.
创建对象的所有字段并使用提供的值填充(如果未指定值,则填充默认值).您可以将其视为实例的准备.准备好并初始化这些成员后,将调用构造函数.
有关更多详细信息,请参阅JLS.
创建对象时,将创建其字段.你有一个班级成员:
private int channel = setChannel(7);
当你这样做时:
new Television(20);
该字段初始化并setChannel
在调用构造函数之前调用,并从那里打印7.
创建对象的所有字段并使用提供的值填充(如果未指定值,则填充默认值).您可以将其视为实例的准备.准备好并初始化这些成员后,将调用构造函数.
有关更多详细信息,请参阅JLS.
因为这是Java 中初始化的顺序.简而言之:
静态成员和块
实例成员和块
构造体
答案可以在Java语言规范中找到:
在作为结果返回对新创建的对象的引用之前,处理指示的构造函数以使用以下过程初始化新对象:
将构造函数的参数分配给此构造函数调用的新创建的参数变量.
如果此构造函数以同一类中的另一个构造函数的显式构造函数调用(第8.8.7.1节)开头(使用此)...
...如果此构造函数用于Object以外的类,则此构造函数将以超类构造函数的显式或隐式调用开始(使用super)...
为此类执行实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值按从左到右的顺序分配给相应的实例变量,在这些顺序中,它们以文本方式出现在类的源代码中.如果执行任何这些初始值设定项导致异常,则不会处理其他初始化程序,并且此过程会突然完成同样的异常.否则,继续步骤5.
执行此构造函数的其余部分.如果执行突然完成,则此过程突然完成,原因相同.否则,此过程正常完成.
总而言之,如果构造函数不调用另一个构造函数(使用this
)并且它不调用任何超类构造函数(使用super
),则在执行构造函数的代码之前初始化实例变量.
首先,初始化私有字段,然后调用构造函数.
所以输出是7 20.
在java中,实例化一个新对象时发生以下过程:
对对象的所有私有字段进行评估.
然后,只有这样,才会调用构造函数.