当前位置: 首页 > 知识库问答 >
问题:

Java中的默认值和初始化

伏德义
2023-03-14

根据我的参考,基元类型具有默认值,对象为null。我测试了一段代码。

public class Main {
    public static void main(String[] args) {
        int a;
        System.out.println(a);
    }
}

系统。出来println(a)将是指向变量a的错误,表示变量a可能尚未初始化,而在给定引用中,整数0作为默认值。但是,使用下面给定的代码,它将实际打印0

public class Main {
    static int a;
    public static void main(String[] args) {
        System.out.println(a);
    }
}

第一个代码可能会出什么问题?类变量的行为是否与局部变量不同?

共有3个答案

卫甫
2023-03-14

这些是所涉及的主要因素:

  1. 成员变量(默认OK)
  2. 静态变量(默认OK)
  3. 最终成员变量(未初始化,必须在构造函数上设置)
  4. final static变量(未初始化,必须在静态块上设置{})
  5. 局部变量(未初始化)

注1:必须在每个实现的构造函数上初始化最终成员变量!

注意2:必须在构造函数本身的块内初始化最终成员变量,而不是调用另一个初始化它们的方法。例如,这是无效的:

private final int memberVar;

public Foo() {
    // Invalid initialization of a final member
    init();
}

private void init() {
    memberVar = 10;
}

注3:数组在Java中是对象,即使它们存储原语。

注意4:初始化数组时,其所有项都设置为默认值,与成员或本地数组无关。

我附上了一个代码示例,展示了上述案例:

public class Foo {
    // Static and member variables are initialized to default values

    // Primitives
    private int a; // Default 0
    private static int b; // Default 0

    // Objects
    private Object c; // Default NULL
    private static Object d; // Default NULL

    // Arrays (note: they are objects too, even if they store primitives)
    private int[] e; // Default NULL
    private static int[] f; // Default NULL

    // What if declared as final?

    // Primitives
    private final int g; // Not initialized. MUST set in the constructor
    private final static int h; // Not initialized. MUST set in a static {}

    // Objects
    private final Object i; // Not initialized. MUST set in constructor
    private final static Object j; // Not initialized. MUST set in a static {}

    // Arrays
    private final int[] k; // Not initialized. MUST set in constructor
    private final static int[] l; // Not initialized. MUST set in a static {}

    // Initialize final statics
    static {
        h = 5;
        j = new Object();
        l = new int[5]; // Elements of l are initialized to 0
    }

    // Initialize final member variables
    public Foo() {
        g = 10;
        i = new Object();
        k = new int[10]; // Elements of k are initialized to 0
    }

    // A second example constructor
    // You have to initialize final member variables to every constructor!
    public Foo(boolean aBoolean) {
        g = 15;
        i = new Object();
        k = new int[15]; // Elements of k are initialized to 0
    }

    public static void main(String[] args) {
        // Local variables are not initialized
        int m; // Not initialized
        Object n; // Not initialized
        int[] o; // Not initialized

        // We must initialize them before use
        m = 20;
        n = new Object();
        o = new int[20]; // Elements of o are initialized to 0
    }
}
柴嘉禧
2023-03-14

请仔细阅读您的推荐信:

默认值

声明字段时并不总是需要赋值。已声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,这个默认值将是零或空,这取决于数据类型。然而,依赖这样的默认值通常被认为是糟糕的编程风格。

下图总结了上述数据类型的默认值。

...

局部变量略有不同;编译器从不为未初始化的局部变量指定默认值。如果无法在声明局部变量的位置初始化它,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。

王凯旋
2023-03-14

在第一个代码示例中,a是一个main方法局部变量。方法局部变量在使用之前需要初始化。

在第二个代码示例中,a是类成员变量,因此它将被初始化为默认值。

 类似资料:
  • 考虑以下代码 VS2013编译器发出以下警告: 警告C4351:新行为:数组“B::member”的元素将默认初始化1 这里有记载 使用C 11,并应用“默认初始化”的概念,意味着B. part的元素将不会被初始化。 但我认为,成员{}应该执行值初始化,而不是默认初始化。VS2013编译器是否损坏? 8.5美元/6 默认初始化类型为T的对象意味着:-如果T是(可能是cv限定的)类类型(第9条),则

  • 问题内容: 假设我有一个枚举,然后实例化一个天数组。 如何将一天(例如)设置为所有“天”的默认值?如果如上所述进行设置,则所有元素均为空。我希望通过枚举表现得更像ints和Strings,它们分别初始化为0和“”。 问题答案: 正如其他人所说,枚举是引用类型-它们只是特定类的编译器语法糖。JVM不了解它们。这意味着该类型的默认值为null。当然,这不仅会影响数组- 这意味着类型为枚举的任何字段的初

  • 问题内容: 众所周知,根据JLS7 p.4.12.5, 每个实例变量均使用默认值初始化。例如(1): 但是我一直认为,这样的类实现(2): 绝对等于示例(1)。我期望,复杂的Java编译器会看到(2)中的所有这些初始化值都是多余的,并忽略了它们。 但是突然对于这两个类,我们有两个不同的字节码。 例如(1): 例如(2): 问题是: 为什么?但这是显而易见的要优化的事情。什么原因? UPD: 我使用

  • null 必需的 获取java对象(根元素),它完全表示xml和每个由默认值初始化的成员。 当我试图在不显式设置值的情况下marshall xml时,默认值并不能使sence...有什么方法可以在不自定义生成的类的情况下,用默认值填充xml吗? .xsd的示例: 和java类:

  • 问题内容: 考虑一个名为的Java字符串字段。为类x创建对象时的初始值是多少? 我知道对于变量,在创建实例时将默认值分配为。但是会变成什么呢? 问题答案: 如果不执行任何操作,则将其初始化为null,所有引用类型也将初始化为null。

  • 问题内容: 我有一个对象 我用两种方式初始化它 这是输出 似乎builder没有获得默认值。我在属性中添加了注释,对象现在看起来像这样 这是控制台输出 我怎样才能使他们俩都成为? 问题答案: 我的猜测是,这是不可能的(没有删除代码)。但是,为什么不仅仅实现所需的构造函数呢?Lombok旨在使您的生活更轻松,如果Lombok无法解决某些问题,请按照老式的方式进行操作。 控制台输出: