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
我知道以前有人问过这样的问题,但我找不到满意的答案。 假设 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);'行
之前和之后在你的程序中打印objfoo 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