Java 将方法级别的引用变量分配给类级别的引用变量是否安全?

Java 将方法级别的引用变量分配给类级别的引用变量是否安全?,java,member-functions,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

如果我有以下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;

现在有意义了,内存的哪个区域
位置
正在引用?

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


使用此方法,您的代码仍能正常工作。

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

int[] modifier = new int[positions.length];
它在堆上为
int
数组创建一个新的内存块,并将
修饰符指向它。现在当你这么做的时候

positions = modifier;
positions
也指向该内存块,而
positions
用于指向的块可以被垃圾收集,前提是它没有被另一个变量引用。如果您将所有Java变量都视为指针,则更容易理解这一点


首字母 位置----------->(分配的空间1) int[]修饰符=新的int[positions.length]; 位置----------->(分配的空间1) 修饰符----------->(分配的空间2) 位置=修改器; (分配的空间1) 位置----------->(分配的空间2)<------修改器
请注意,现在没有任何内容引用分配的空间1,因此垃圾收集器可以释放它。

这可能有助于您理解引用

以下是示例代码:

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

public static void go(Dog dog){...}
这里
d
dog
两个引用都将指向
堆内存中相同的
dog
对象,并且引用将驻留在
堆栈内存中,一旦该方法的作用域完成,该内存将被销毁


将方法级别的引用变量分配给类级别的引用变量是否安全


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

两个引用都将指向内存中的同一对象。引用位于
堆栈内存中,而不是
堆中,实际对象位于
堆内存中。GC从根而不是方法开始垃圾收集。只要对内存位置的任何引用都是可访问的,GC就不会收集它。您给出的代码无效。你是说
int[]修饰符=newint[positions.length]?如果您发布的是实际代码而不是伪代码,那么它确实很有帮助。(我还强烈建议您遵循将类型信息保存在一个位置的Java约定,例如,
private int[]positions
而不是
private int positions[]
)为什么需要在不同的局部变量中分配它?使其成为
final
,以便可以在构建对象时进行分配。
public static void main(String[] args){
    Dog d = new Dog();
    go(d);
}

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