当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《初始化对象时构造函数如何工作?》经验,为你挑选了4个好方法。

此代码的输出为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.



1> Maroun..:

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

private int channel = setChannel(7);

当你这样做时:

new Television(20);

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

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

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



2> endriu_l..:

因为这是Java 中初始化的顺序.简而言之:

    静态成员和块

    实例成员和块

    构造体


@bhutto简短的回答也很好.看看时间,当endriu_l开始回答时,有可能链接到JLS并不是Maroun²的答案.
@ArlaudPierre感谢你们的支持.事实上,第一个答案是缺少JLS链接 - 在我看来 - 在编号列表中指定初始化步骤更具可读性

3> Adam Siemion..:

答案可以在Java语言规范中找到:

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

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

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

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

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

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

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



4> fluminis..:

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

所以输出是7 20.

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

对对象的所有私有字段进行评估.

然后,只有这样,才会调用构造函数.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有