【问题标题】:Difference between creating a "new object" and "Class objectname"创建“新对象”和“类对象名”之间的区别
【发布时间】: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 上搜索过,甚至尝试过,但无法弄清楚。

【问题讨论】:

    标签: java class object


    【解决方案1】:

    Phone p; 只声明了一个引用处理程序p,它不指向任何地方(它没有被初始化并且在你分配一些东西之前不能使用[感谢@Anthony])。

    Phone p = new Phone(200); 声明了一个引用处理程序p,它指向一个新创建的Phone 对象(用Phone(200) 初始化)。

    new Phone(200) 创建了一个新的Phone 对象,但由于没有在任何地方存储对它的引用,因此它立即可以进行垃圾回收(除非它的构造函数在某处存储了引用)。

    (请注意,在Java中,所有类型为引用类型的“变量”实际上都是引用处理程序。只有值类型的变量直接包含值。因为Phone是一个引用类型(它是一个class),Phone p 始终是“对 Phone 的引用”。)

    【讨论】:

    • 第三点:假设构造函数中没有“泄漏这个”:)
    • @KublaiKhan:是的,我说过。构造函数可以调用一些 Mighty Singleton 来存储引用,例如:-)。
    【解决方案2】:

    第一个 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,您需要实例化它(或以其他方式初始化它)。声明本身没有用。在本地(在方法范围内声明的变量)中,在未初始化的情况下使用它是非法的。如果它是类级别的成员,那么当您尝试访问它的任何成员函数时,它将只是一个空指针。

    【讨论】:

    • Java 中的 every 变量没有被初始化吗?第一个p 应该有一个明确的值。
    • @KerrekSB,类成员被初始化为默认值(引用为空),但本地没有被初始化(就编译器而言)并且必须在第一次访问之前。
    • 有趣。那么p处于不确定状态?
    • 从某种意义上说。 JVM 可能会以不同的方式处理它,但是当您尝试使用未分配的本地时,编译器会抱怨。你不能说phone p; if (p.hasPower()) { }。这在运行时不会是NullPointerReference,它只是一个编译时错误。
    【解决方案3】:

    Phone p 是对尚未初始化的 Phone 对象的引用。

    Phone p = new Phone(200) 是对已使用构造函数 Phone(int var) 初始化的 Phone 对象的引用。

    new Phone(200) 使用构造函数 Phone(int var) 创建一个新的 Phone 对象。

    【讨论】:

      【解决方案4】:
      Phone p;
      

      只是一个引用或“指针”,正如一些喜欢 C 语言的人所说的那样。它包含对象的路径,但当前路径为空。

      Phone p = new Phone(200) //(200 is the price of the phone).
      

      在这里,您正在创建一个新的 Phone 对象,方法是调用其构造函数,该构造函数采用 200 值。然后将该对象分配给引用 p。

      new Phone(200)
      

      这里您只是创建了一个 Phone 类型的对象,但没有对它的引用,因此该对象反过来由 JVM 进行垃圾收集(如果内部没有引用其他对象)。

      问候!

      【讨论】:

        【解决方案5】:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-16
        • 2017-10-04
        • 2014-10-19
        • 2012-01-12
        • 2011-07-13
        相关资源
        最近更新 更多