这需要看 User user;出现在哪里,先放结论: 如果是对象的属性(field),则两种写法没有区别。 如果是方法中的局部变量,若方法中没有其他地方对user赋值,则编译错误。 如果是对象的属性,那么在编译的时候,java编译器会自动为field赋初值(原始类型为默认值;引用类型为null)。例如下面的代码: public class TestInitialization { private User userA; } 编译后,使用javap查看字节码,红色部分为编译器自动赋初值的过程: 如果是方法中的局部变量,编译器不会自动赋初值。User user;只是定义的变量user,但并未给user在内存中分配空间,没有初始化,无法通过编译;User user = null;不仅定义了变量user,并且还为user分配了内存空间,user现在指向null。 那么问题来了`null`又是个什么鬼? http://stackoverflow.com/questions/2707322/what-is-null-in-java
这需要看
User user;
出现在哪里,先放结论:如果是对象的属性(field),则两种写法没有区别。
如果是方法中的局部变量,若方法中没有其他地方对user赋值,则编译错误。
如果是对象的属性,那么在编译的时候,java编译器会自动为field赋初值(原始类型为默认值;引用类型为null)。例如下面的代码:
编译后,使用javap查看字节码,红色部分为编译器自动赋初值的过程:

如果是方法中的局部变量,编译器不会自动赋初值。
User user;
只是定义的变量user,但并未给user在内存中分配空间,没有初始化,无法通过编译;User user = null;
不仅定义了变量user,并且还为user分配了内存空间,user现在指向null。