需要你的帮助理解java编程概念

时间:2014-07-01 15:49:41

标签: java class object memory memory-management

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?

6 个答案:

答案 0 :(得分:7)

obj2obj1具有相同的引用,因此修改其中任何一个的状态都会反映在两个变量中,因为它们指向到同一个变量参考

这是解释对象引用行为的图片(在本例中使用Person类进行了解释):

enter image description here

来源: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类型的字段和变量始终是对象的引用。