public class Concept {
int num;
public static void main(String args[])
{
Concept obj1=new Concept();
Concept obj2=obj1;
obj1.num=100;
obj2.num=200;
System.out.println(obj1.num);
System.out.println(obj2.num);
//obj1.num=null;
obj2.num=500;
System.out.println(obj1.num);
System.out.println(obj2.num);
}
}
这里,这是一个简单的java程序。
输出
200
200
500
500
内存分配如何在这里工作?我们如何将null设置为Obj1.num = null?
答案 0 :(得分:7)
obj2
与obj1
具有相同的引用,因此修改其中任何一个的状态都会反映在两个变量中,因为它们指向到同一个变量参考
这是解释对象引用行为的图片(在本例中使用Person
类进行了解释):
来源:https://stackoverflow.com/a/7034719/1065197
请注意,您无法在Java中使int
或任何原始值无效,因此obj1.num = null
无效。但是,如果您将num
声明为Integer
,则可以将其值设置为null
,因为Integer
是基元{{1}的包装类 }}
答案 1 :(得分:6)
你一次问两个问题。
Java使用引用,因此通过设置obj2 = obj1
,值未复制,两个引用都引用同一个对象。将num
设置为obj1
的值与设置obj2
的值相同。
在内存中它看起来像:
+-----------------+
obj2 -> | Concept | <- obj1
+-----+-----+-----+
| num | int | 200 |
+-----+-----+-----+
但是,如果您使用以下代码,则将构造两个对象:
Concept obj1 = new Concept();
obj1.num = 200;
Concept obj2 = new Concept();
obj2.num = 300;
然后内存看起来像:
+-----------------+ +-----------------+
obj1 -> | Concept | obj2 -> | Concept |
+-----+-----+-----+ +-----+-----+-----+
| num | int | 200 | | num | int | 300 |
+-----+-----+-----+ +-----+-----+-----+
因此,从num
修改obj1
会设置内存的不同部分而不是obj2
。
您无法将null
分配给int
:它是原始类型。如果您想要一个null
值的整数,请尝试Integer
。
答案 2 :(得分:3)
Java不是C ++,
Concept obj1=new Concept();
Concept obj2=obj1; // obj2 is a reference to obj1.
我想你想要,
Concept obj1=new Concept();
Concept obj2=new Concept();
此外,您无法将基本类型(如int
)设置为null。您可以将Integer
包装器设置为null,
Concept {
// int num;
Integer num = null;
答案 3 :(得分:2)
您不能,因为您将num
声明为int
,这是原始类型。
你能做什么?
您可以使用其wrapper class Integer
:
Integer num;
...
num = null; // valid since num is now an object
答案 4 :(得分:2)
public class Concept {
int num;
public static void main(String args[])
{
Concept obj1=new Concept(); // Only one Concept object created. The reference obj1 is pointing to it.
Concept obj2=obj1; // now 2 references obj1 and obj2 are pointing to the same object.
obj1.num=100; // since both references are pointing to the same object, the changes they make will be on the `same` object
obj2.num=200;
System.out.println(obj1.num);
System.out.println(obj2.num);
//obj1.num=null;
obj2.num=500;
System.out.println(obj1.num);
System.out.println(obj2.num);
}
}
答案 5 :(得分:1)
Obj1.num=null;
num不能设置为null,因为num是一个原始int,而不是一个对象。在Java中,只有对象引用可以设置为null。
至于内存处理。我在下面注释了您的代码,以解释发生了什么。
public class Concept {
int num;
public static void main(String args[])
{
Concept obj1=new Concept(); // A new object is created. Ref stored in obj1
Concept obj2=obj1; // The ref from obj1 is copied to obj2
obj1.num=100; // obj1 and obj2 now hold the same ref to the same object
obj2.num=200; // overwrites previous assignment; the java compiler is likely to strip out the previous line as it is redundant
System.out.println(obj1.num);
System.out.println(obj2.num);
//obj1.num=null;
obj2.num=500; // as before
System.out.println(obj1.num);
System.out.println(obj2.num);
}
}
值得注意的是,与其他语言不同,Java总是在堆上创建其对象。在其管理下的内存区域,它为我们收集垃圾。它不会在堆栈上创建对象,因此Object类型的字段和变量始终是对象的引用。