2009-12-16 46 views
3

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

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

s始终为空?

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

那么方法中的局部变量呢?

 
public void meth() { 
    int i; 
} 

什么是i的单位化值?


<依靠这种默认值,但是,通常被认为是不好的编程风格>

好吧,你有什么建议,我们怎么办?

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

OR

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

哪个更好,为什么?

+0

你为什么不通过调试器运行它并找出? – Pat 2009-12-16 09:44:28

+0

答案在我的评论中。 – EugeneP 2009-12-16 09:54:40

回答

19

中太阳java tutorial

它并不总是必要的,当某个字段声明指定一个 值。已声明但未初始化的字段 将由编译器设置为 的合理默认值。一般来说,这个 默认值将为零或为空, 取决于数据类型。依靠 这样的默认值,然而, 一般认为编程不好 风格。

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

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 

局部变量略有不同 ;编译器从未将 默认值分配给未初始化的局部变量 。如果您不能 初始化您的本地变量,其中 它被声明,请确保在尝试使用它之前为其分配一个值 。 访问未初始化的本地变量 将导致编译时 错误。

4

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

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

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

+0

或布尔值为false。 – Thilo 2009-12-16 08:37:29

+0

或对象为空 – Ash 2009-12-16 08:38:43

+0

<<另外,在你的二传手中,你需要确保有人不会试图将其设置回null >> 吨和愚蠢的工作吨。当然,我可以做到这一点。但那不是我期望的编程风格。假设你必须为1000个字段这样做。 – EugeneP 2009-12-16 08:54:22

3

Fields: Object default to null;整数,多头和空头至0;字符串为null;布尔人为假。这全是here

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

2

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

+3

..虽然尝试只有在您确定的情况下才有意义,但现场初始化已定义且可靠。当然,我们知道,它是,并且编译器不会让你去那里(局部变量)。但是,如果您不确定并且不知道该在哪里寻找,那么它既是一个问题也是一个很好的答案(顺便说一句,+1)。 – 2009-12-16 08:46:29

+2

- >坦率地说,你可以试过那个。 它可能是一个不可重复的测试。你可以得到0千次。然后,随着内存刷新,获得40亿美元。 – EugeneP 2009-12-16 08:50:44

1

至于setter-method的问题:setter的全部重点是他们可以检查传递的对象是否符合类的要求。例如

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

或者与谷歌集合/谷歌番石榴:

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"); 
    ... 

当然你应该这样的情况下,总是在设置者和/或类的JavaDoc中声明属性的正确值范围。

+0

好吧,preconditions.checknotnull看起来很漂亮! 为什么它不在标准的java库中?这就是我对Java的期望。 – EugeneP 2009-12-16 09:02:49