分配引用变量是否安全,它是类级别引用变量的方法级别?

时间:2014-06-09 16:18:26

标签: java member-functions

如果我有以下Java程序代码

class Dotcom{
    private int positions[];// position is reference variable at class level
    //some other instance variables
    // suppose here we have setter for initialising "positions"
    public void Somefun (){
           int modifier [positions.length];
           // code for initialising "modifier"
           positions = modifier; 
    }
}

所以我的问题是当Somefun函数返回时,修饰符引用的内存部分将有资格进行垃圾收集,因为修饰符被销毁。声明

 positions = modifier;

现在知道哪个内存区positions正在引用?

3 个答案:

答案 0 :(得分:1)

您当前的代码无法编译(Java没有静态数组)。你需要:

int[] modifier = new int[positions.length];

在堆上为int数组创建一个 new 内存块,并为其指向modifier。现在当你做

positions = modifier;

positions 指向该内存块,positions 使用指向的块可以进行垃圾回收,假设它没有被另一个变量引用。如果将所有Java变量都视为指针,就会更容易理解这一点。


Initial
positions --------> (Allocated space 1)


int[] modifier = new int[positions.length];
positions --------> (Allocated space 1)
modifier  --------> (Allocated space 2)


positions = modifier;
                    (Allocated space 1)
positions --------> (Allocated space 2) <-------- modifier

请注意,现在没有任何内容引用分配的空间1 ,因此它可以被垃圾收集器释放。

答案 1 :(得分:0)

这是人们设置和修改实例变量的一种非常常见的方式。垃圾收集器不会拾取位置,但它会获取用于指向其位置的OLD地址。

使用此方法,您的代码仍可按预期工作。

答案 2 :(得分:0)

这可能有助于您理解参考文献。

以下是示例代码:

public static void main(String[] args){
    Dog d = new Dog();
    go(d);
}

public static void go(Dog dog){...}

此处ddog两个引用都将指向Dog中的相同The Heap memory对象,引用将位于The Stack memory中一旦该方法的范围完成就被销毁。

enter image description here


  

将参考变量分配给类级参考变量是否安全?

如果您有任何对象的引用,那么您可以自由地使用它。尽量避免这种类型的赋值可能导致应用程序后期出现错误,并且很难检测到这类错误,因为您不知道哪个引用已经更改了值。