【发布时间】:2011-11-29 16:44:42
【问题描述】:
例如,我有一个名为 Phone 的类。
有什么区别:
Phone p;
和
Phone p = new Phone(200) //(200 is the price of the phone).
和
new Phone(200)
我在 Eclipse 上搜索过,甚至尝试过,但无法弄清楚。
【问题讨论】:
例如,我有一个名为 Phone 的类。
有什么区别:
Phone p;
和
Phone p = new Phone(200) //(200 is the price of the phone).
和
new Phone(200)
我在 Eclipse 上搜索过,甚至尝试过,但无法弄清楚。
【问题讨论】:
Phone p; 只声明了一个引用处理程序p,它不指向任何地方(它没有被初始化并且在你分配一些东西之前不能使用[感谢@Anthony])。
Phone p = new Phone(200); 声明了一个引用处理程序p,它指向一个新创建的Phone 对象(用Phone(200) 初始化)。
new Phone(200) 创建了一个新的Phone 对象,但由于没有在任何地方存储对它的引用,因此它立即可以进行垃圾回收(除非它的构造函数在某处存储了引用)。
(请注意,在Java中,所有类型为引用类型的“变量”实际上都是引用处理程序。只有值类型的变量直接包含值。因为Phone是一个引用类型(它是一个class),Phone p 始终是“对 Phone 的引用”。)
【讨论】:
第一个 sn-p 只声明了一个变量p,其类型为Phone。您还没有创建任何对象,只有一个变量。
第三个实例化一个新的Phone 对象(未分配给变量)。
第二个将声明和实例化两者结合到一行代码中。
Phone p; // declaration of variable
p = new Phone(200); // instantiation of object, assigned to variable
Phone p = new Phone(200); // declaration and instantiation in a single line
要使用p,您需要实例化它(或以其他方式初始化它)。声明本身没有用。在本地(在方法范围内声明的变量)中,在未初始化的情况下使用它是非法的。如果它是类级别的成员,那么当您尝试访问它的任何成员函数时,它将只是一个空指针。
【讨论】:
p 应该有一个明确的值。
p处于不确定状态?
phone p; if (p.hasPower()) { }。这在运行时不会是NullPointerReference,它只是一个编译时错误。
Phone p 是对尚未初始化的 Phone 对象的引用。
Phone p = new Phone(200) 是对已使用构造函数 Phone(int var) 初始化的 Phone 对象的引用。
new Phone(200) 使用构造函数 Phone(int var) 创建一个新的 Phone 对象。
【讨论】:
Phone p;
只是一个引用或“指针”,正如一些喜欢 C 语言的人所说的那样。它包含对象的路径,但当前路径为空。
Phone p = new Phone(200) //(200 is the price of the phone).
在这里,您正在创建一个新的 Phone 对象,方法是调用其构造函数,该构造函数采用 200 值。然后将该对象分配给引用 p。
new Phone(200)
这里您只是创建了一个 Phone 类型的对象,但没有对它的引用,因此该对象反过来由 JVM 进行垃圾收集(如果内部没有引用其他对象)。
问候!
【讨论】: