Java 将方法级别的引用变量分配给类级别的引用变量是否安全?
如果我有以下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
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){...}