如果我有以下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
正在引用?
答案 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){...}
此处d
和dog
两个引用都将指向Dog
中的相同The Heap memory
对象,引用将位于The Stack memory
中一旦该方法的范围完成就被销毁。
将参考变量分配给类级参考变量是否安全?
如果您有任何对象的引用,那么您可以自由地使用它。尽量避免这种类型的赋值可能导致应用程序后期出现错误,并且很难检测到这类错误,因为您不知道哪个引用已经更改了值。