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

Object类型是否为null

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

会永远是null吗?

简单类型如int ? 那会是什么? 零或任意值?

方法中的局部变量怎么样?

 public void meth() { int i; } 

我的酉值是多少?


然而,依赖于这样的默认值通常被认为是糟糕的编程风格。

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

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

要么:

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

哪个更好?为什么?

来自太阳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 

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

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

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

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

字段:对象默认为null; 整数,多头和空头到0; 字符串为null; 布尔到假。 一切都在这里

编译器将强制您初始化方法, 局部变量 ,您自己声明的变量

原始字段初始化为0 / false 。 对象初始化为null 。 但坦率地说,你可以试过那个……

至于setter方法问题:setter的重点是它们可以检查传递的对象是否符合类的要求。 例如

 public void setS(String s) { if (s == null) throw new IllegalArgumentException("S must not be null"); this.s = s; } 

或者,使用Google Collections / Google Guava:

 public void setS(String s) { this.s = Preconditions.checkNotNull(s, "S must not be null"); } 

当然,您可以定义任意约束,例如:

 /** * Sets the foo. Legal foo strings must have a length of exactly 3 characters. */ public void setFoo(String foo) { if (foo == null) throw new IllegalArgumentException("Foo must not be null"); if (foo.length() != 3) throw new IllegalArgumentException("Foo must have exactly 3 characters"); ... 

当然,在这种情况下,您应该始终在setter和/或类的JavaDoc中为属性声明正确的值范围。