首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java成员初始化

Java成员初始化
EN

Stack Overflow用户
提问于 2011-09-08 14:35:27
回答 8查看 3.3K关注 0票数 5

它们之间的区别是什么:

代码语言:javascript
复制
public class A
{
    private int x = 1;
    A() {}
}

代码语言:javascript
复制
public class A
{
    private int x;
    A() { x = 1; }
}

,如果有的话?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-09-08 14:38:14

如果你从实际的角度来看,不同之处在于,对于第二种形式的初始化,如果你要编写许多重载的构造函数,那么你必须为你编写的每个构造函数重复初始化。

票数 3
EN

Stack Overflow用户

发布于 2011-09-08 14:41:12

在第二种情况下,您会重复初始化x=0的过程,因为它是实例变量,所以默认情况下会被初始化为0。

  • 如果多个构造函数将为there.else,这可能是不同的,我不认为有任何其他区别。
票数 2
EN

Stack Overflow用户

发布于 2011-09-08 14:48:43

来自JLS 12.5

每当创建新的类实例时,都会为其分配内存空间,为类类型中声明的所有实例变量和类类型的每个超类中声明的所有实例变量提供空间,包括可能隐藏的所有实例变量。

再往下看,它写道:

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

  1. 将构造函数的参数分配给新创建的用于此构造函数调用的参数变量。
  2. 如果此构造函数以显式调用同一类中的另一个构造函数开始(使用此方法),则计算参数并使用以下五个步骤递归处理该构造函数调用。如果构造函数调用突然完成,则由于同样的原因,此过程也会突然完成;否则,请继续执行步骤5。
  3. 此构造函数不会从显式调用同一类中的另一个构造函数(使用此函数)开始。如果此构造函数用于Object以外的类,则此构造函数将从显式或隐式调用超类构造函数开始(使用super)。使用同样的五个步骤,递归地计算参数并处理超类构造函数调用。如果构造函数调用突然完成,则此过程也会出于同样的原因突然完成。否则,请继续执行步骤4。
  4. 执行此类的实例初始化器和实例变量初始化器,将实例变量初始化器的值赋给相应的实例变量,按实例变量在类的源代码中以文本形式出现的顺序从左到右。如果执行这些初始化器中的任何一个都会导致异常,则不会处理更多的初始化器,并且此过程会突然结束,但会出现相同的异常。否则,请继续执行步骤5。(在某些早期实现中,如果字段初始化器表达式是一个常量表达式,并且该常量表达式的值等于此构造函数主体的其余部分的type.)
  5. Execute的默认初始值,则编译器错误地省略了初始化字段的代码。如果该执行突然完成,则此过程也会因同样的原因突然完成。否则,此过程将正常完成。

本质上,JVM为变量x (以及超类的所有实例变量)创建内存,并使用默认值(x0)初始化每个实例。在返回类A的新实例之前,它现在将执行构造函数体。

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

https://stackoverflow.com/questions/7344051

复制
相关文章

相似问题

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