java - 声明时初始化和构造函数中初始化的区别

标签 java variables constructor

<分区>

下面这两个有什么区别,哪个更可取??

public class foo {

    int i = 2;

}

public class foo {

  int i;
    foo() {

        i = 2;

    }
}

最佳答案

在您的示例中,行为语义没有区别。在 Java 中,所有实例字段初始化器(和实例 block )都在父类(super class)初始化之后和构造函数体之前执行;见JLS 12.5 .

区别在于代码的可读性和(在其他示例中)避免重复编码和脆弱性1。这些需要根据具体情况进行评估。

还值得注意的是,有些情况下必须在构造函数中进行初始化;即当初始化取决于构造函数参数时。


1 - 重复性和脆弱性问题是同一件事的两面。如果您有多个构造函数,“在构造函数中初始化”方法往往会导致重复。如果您添加额外的字段,您可能会将初始化添加到所有相关的构造函数中;即脆弱性。

关于java - 声明时初始化和构造函数中初始化的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15065939/

相关文章:

java - OpenGL 着色器 - 围绕原点旋转模型(2D 世界)

java - OSGi 服务类依赖关系

java - 使用 Tomcat 5.0 动态创建 jsf 组件时出错

用于检查/分配变量的 c# 习语

java - 在处理中实例化变量异常

java - 向对象添加唯一 ID (UUID)

bash - 通过 (*) 星号将文件添加到 for 循环中的变量

javascript - 动态 JavaScript 变量

c++ - 为什么在ctor中不允许访问成员对象的成员?

c++ - 您可以将 "this"静态转换为基类构造函数中的派生类,然后稍后使用结果吗?