Java class 变量是对 class 对象的引用吗?

Is a Java class variable a reference to a class object?

我知道以前有人问过这样的问题,但我找不到满意的答案。 假设 java class :

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++ 派生这个定义,引用就像常量指针)。

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

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++ 不同,它们不是常量指针,您可以将它们视为普通的 pointers 来自 c++,您可以更改它的内存位置 refers/points 在任何时候,鉴于限制,它必须是同一类型的内存位置,即对象必须是同一类型 (foo)

Foo obj 在 Java 中创建一个 reference variable,它可以保存对 class.

对象的引用

new Foo(); 语句实际上创建了一个对象。你写多少次new Foo();就会创建一个新对象。

if obj is a reference then should'nt it only point to one object

不,事实并非如此。一个引用变量只能指向一个对象,这不是任何一种限制。它可以指向任何对象。

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

int a = 10;
a = 15;

正如其他用户已经发布的那样,Java 中的对象没有指向它的引用变量,可以被垃圾收集。

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

声明+实例化+初始化

obj = new foo(8);

实例化+初始化

我在'obj = new foo(8);'行

之前和之后在你的程序中打印obj
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