我知道之前已经问过这个问题,但我找不到满意的答案。 假设一个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 ++派生这个定义,引用就像常量指针)。
答案 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