【问题标题】:Java non-static member variable initialization [duplicate]Java非静态成员变量初始化[重复]
【发布时间】:2014-01-12 17:10:40
【问题描述】:

这可能是“重复”,但我不确定如何搜索这个问题...

我在声明行初始化一个非静态成员变量:

public class A
{
    private B b = new B();
    ...
}

我正在这样做,而不是在默认构造函数中初始化这个变量:

public class A
{
    private B b;
    public A()
    {
        b = new B();
    }
    ...
}

两者之间有什么区别,除了(也许)前者不是“ANSI Java”或类似的东西?

对于上述两种实现,我得到了两个不同的字节码(即两个不同的“类”文件),这让我相信可能存在运行时差异。

所以我想知道我是否有理由期望在运行时有什么不同。

谢谢

【问题讨论】:

    标签: java constructor member-variables


    【解决方案1】:

    第一个是声明和初始化同时进行。

    在第二个示例中,您没有初始化 b 变量的声明,然后在构造函数中初始化变量...

    添加另一个构造函数时可能会出现功能差异,在这种情况下,即使在该构造函数中也应该初始化 b 变量,否则,将会有很大的不同。

    在第一种情况下,无论您实现多少构造函数,都已初始化变量...

    老实说,我不明白你怎么能假装拥有相同的字节码,在这种情况下写两个不同的东西。

    【讨论】:

    • 但这是一个非静态成员变量。当我创建A 的实例时,该变量将在构造函数内部或外部初始化。也许您的意思是区别在于操作的顺序?第一个变量b被初始化,然后方法A()被调用,反之亦然?
    【解决方案2】:

    一般来说没有什么不同(意味着在构造函数外部和内部声明会表现不同)。只是提醒一下,在进入某些特定的构造函数之前,将首先运行外部初始化。例如:

    class A {
      int a = 3;
      public A() {
         a = 4;  // now a = 4. not 3
      }
    }
    

    但是,我经常将它们用于不同的目的:

    1. 在构造函数中初始化变量使其更清晰,并帮助您初始化更复杂的东西。例如,放置一些逻辑代码,放置一个循环来添加项目,......在构造函数范围之外初始化时你不能这样做。

    2. 当您有许多重载构造函数,并且某些变量总是声明相同时。简单的“状态变量”,例如isExist isEmpty ...我经常在构造函数范围之外进行初始化。因此,所有其他构造函数都不会做同样的事情。

    【讨论】:

      【解决方案3】:

      没有区别,两种代码都运行良好。我个人更喜欢大班第二种方式,小班首选第一种方式。

      【讨论】:

        【解决方案4】:

        这两种方法之间有一个小区别!

        当在构造函数中声明变量时,有可能在一段时间后创建第二个构造函数并且该变量将被取消初始化。为了与之抗争,将此变量声明为最终变量-当然如果​​可能的话;)

        不存在其他差异:)

        public class A
        {
            private B b;
            public A() {
                b = new B();
            }
            public A(int value) { // second constructor
            }
            ...
        }
        

        使用A a = new A(5);字段后bnull

        【讨论】:

        • “将创建第二个构造函数”?这到底是什么意思?
        • 附@barakmanos 示例
        【解决方案5】:

        主要区别在于函数调用的顺序:

        • 在第一种情况下,方法 B() 在方法 A() 之前调用。
        • 在第二种情况下,方法A()在方法B()之前被调用。

        另一个区别是所有其他答案中所建议的内容......

        当存在不初始化变量b的非默认构造函数时:

        • 在第一种情况下,变量b 将在使用该构造函数时被初始化甚至
        • 在第二种情况下,变量 b不会在使用该构造函数时被初始化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-09
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 2013-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多