Java 对象字段是用什么初始化的?

2022-09-05 00:09:33

是针对类型吗?nullObject

class C {
    int i;
    String s;
    public C() {}
}

会永远?snull

那么简单类型作为 ?那会是什么?零还是任意值?int

方法中的局部变量呢?

public void meth() {
    int i;
}

的单位化值是多少?i


但是,依赖这些默认值通常被认为是糟糕的编程风格。

好的,你建议我们做什么?

class A {
    String s = "";
    int i = 0;
}

或:

class A {
    String s;
    int i;
    public A() {
        // default constructor
        s = "";
        i = 0;
    }
}

哪个更好,为什么?


答案 1

来自 suns java 教程

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

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

Data Type   Default Value (for fields)
byte                    0 
short                   0   
int                     0 
long                    0L 
float                   0.0f 
double                  0.0d 
char                    '\u0000' 
boolean                 false
String (or any object)  null 

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


答案 2

对于成员变量:String 的默认值为 null。基元的默认值为 0(浮点值为 0.0)。

对于局部变量:在使用局部变量之前,必须对其进行显式初始化。

至于问题的第二部分:你总是可以在成员变量定义或构造函数中说。然后您知道它将具有非空值。(此外,在您的 setter 中,您需要确保有人不会尝试将其设置回 null。String s = "";s = "";