Java类变量是否是对类对象的引用?

时间:2015-06-16 08:39:04

标签: java class object reference

我知道之前已经问过这个问题,但我找不到满意的答案。 假设一个java类:

class Foo{
    public int k;
    Foo(int a){
         k=a;
    } 
}
class My{
    public static void main(String args[]){
        Foo obj = new Foo(5);//1
        obj=new Foo(8); //2
    }
}

我想知道是否可以假定obj是对foo类型的对象的引用。根据我在第1行中的理解,JVM创建了一个新的foo类型的对象并将其引用传递给obj,但在第2行中,我们能够用新对象覆盖obj的值。

所以我的问题是如果obj是一个引用,那么它应该只指向一个对象(从c ++派生这个定义,引用就像常量指针)。

4 个答案:

答案 0 :(得分:1)

你理解是完全正确的。 obj现在指向第二个foo对象。在这种情况下,foo(5)不会被任何对象引用,并且将被JVM垃圾收集。

答案 1 :(得分:1)

obj是对foo类型对象的引用,您的理解是正确的。在第1行中,JVM创建类型为foo的新实例(ojbect)(在堆中分配新内存),obj现在存储对该内存位置的引用,假设内存位置为1001。所以在第一行之后 -

obj -> 1001

在第2行之后,JVM创建了一个相同类型foo的新对象(这是在堆中分配的全新内存),让我们说这次2001,是分配给新对象的内存,现在在第2行之后,obj的引用已更新,并从1001更改为2001

obj -> 2001

在第2行之后,在内存位置1001中分配的对象在代码中没有任何引用,因此最终JVM会垃圾收集该内存,这意味着它将释放内存以供将来分配给其他对象

Java中的引用与C ++不同,它们不是常量指针,您可以将它们视为来自c ++的正常pointers,您可以随时更改它引用/指向的内存位置,给定限制,它必须是相同类型的内存位置,即对象必须是相同类型(foo

答案 2 :(得分:1)

Foo obj在Java中创建一个reference variable,它可以保存对该类对象的引用。

new Foo();语句实际上创建了一个对象。在编写new Foo();时,会多次创建新对象。

  

如果obj是一个引用,那么它应该只指向一个对象

不是不是这样。一个引用变量只能指向一个对象并不是任何限制。它可以指向任何对象。

我会说它类似于以下内容,

int a = 10;
a = 15;

正如其他用户已经发布的那样,Java中的一个对象没有指向它的引用变量,可以是Garbage Collected。

答案 3 :(得分:0)

Foo obj = new Foo(5);//1

声明+实例化+初始化

obj = new foo(8);

实例化+初始化

我在你的节目中打印obj,然后在' obj = new foo(8);'线

foo obj = new foo(5);// 1
System.out.println("Before:" + obj);
obj = new foo(8); // 2
System.out.println("After:" + obj);

,输出

Before:com.test.foo@1db9742
After:com.test.foo@106d69c

您可以从此输出中轻松了解new foo(8);语句实际创建了一个新对象。

有关更多信息,请参阅Java文档Creating Objects