我想知道类成员变量和方法局部变量之间的区别。这里解释;
这是针对类成员变量的;
public class Foo{
static String ref;
public static void union(String a, String b){
ref= a+b;
}
}
这是方法局部变量;
public class Foo{
public static void union(String a, String b){
String ref= a+b;
}
}
假设我经常调用这个函数,在第二个例子中JVM是否每次都创建ref引用(如果我应该像第一个例子一样编写?)或者JVM创建一次并且总是使用它?
答案 0 :(得分:4)
你需要在这里区分两件事:
在两种情况下,都会创建表达式String
的新a + b
对象。
使用类字段存储结果时,每次都使用相同的内存。内存位于堆中的某个位置。但是:如果你同时从多个线程调用该方法,它们将使用相同的内存来存储它们的结果,并且它们将覆盖它。这意味着一个线程可能会看到不同线程的结果,这很糟糕。
使用局部变量时,每个方法调用都使用新内存。但这是调用堆栈上的本地内存,实际上并不需要任何费用。另外,您可以同时从多个线程调用您的方法。
因此,您应该使用第二个片段。
答案 1 :(得分:1)
Class fields
可以从类中的多个方法获得,而local variables
只能从方法中访问。只有当他们真正将类别的属性保留在本地时,才会使用Class fields
。