[英]Anonymous class in static method, holds reference to what?
Afaik, in Java an anonymous inner class always holds a reference to the enclosing instance of its outer class. Afaik,在Java中,匿名内部类总是拥有对其外部类的封闭实例的引用。 Now what happens when I put an anonymous class inside a static method? 现在当我在静态方法中放入一个匿名类时会发生什么? As there is no object of its outer class, does it hold a reference to the class that calls the static method? 由于它的外部类没有对象,它是否包含对调用静态方法的类的引用? I am a bit confused here. 我在这里有点困惑。 Consider the Android example below (using the parse.com framework): 考虑下面的Android示例(使用parse.com框架):
public class OnlineQuery {
public static void queryUsers(final ListenerInterface listener) {
ParseQuery<ParseUser> query = User.getQuery();
query.findInBackground(new FindCallback<ParseUser>() {
@Override
public void done(final List<ParseUser> userList, ParseException e) {
listener.reportBackToCallingActivity();
// to which class is as a reference held here?
}
});
}
}
public class MainActivity extends Activity implements OnlineQuery.ListenerInterface {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OnlineQuery.queryUsers(this)
}
...
}
Also, is using a listener as shown in the example bad practice regarding memory leaks? 另外,正在使用一个监听器,如示例中关于内存泄漏的错误做法所示? Thanks! 谢谢!
I made a little throwaway class (it's Java 9, but I doubt that makes a difference) and used javap
to disassemble it, and apparently they do not explicitly declare a field containing a reference to the outer class, unlike anonymous classes in instance methods. 我创建了一个小的一次性类(它是Java 9,但我怀疑它有所不同)并使用javap
来反汇编它,显然它们没有显式声明包含对外部类的引用的字段,这与实例方法中的匿名类不同。
Here's the source code: 这是源代码:
import java.util.function.Supplier;
/* Temporary program. */
public class Temp
{
static <T> Supplier<T> refSupplier(T obj)
{
return new Supplier<>()
{
public T get()
{
return null;
}
};
}
public static void main(String... args) {}
}
And here's the disassembled class file for the anonymous Supplier
: 这是匿名Supplier
的反汇编类文件:
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src> javap -c -p Temp`$1
Compiled from "Temp.java"
class Temp$1 implements java.util.function.Supplier<T> {
Temp$1();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public T get();
Code:
0: aconst_null
1: areturn
}
Here's the source code for Temp
, with a static class replacing the anonymous class: 这是Temp
的源代码,静态类替换了匿名类:
import java.util.function.Supplier;
/* Temporary program. */
public class Temp
{
static class UselessSupplier implements Supplier<Object>
{
@Override
public Object get()
{
return null;
}
}
public static void main(String... args) {}
}
And here's its bytecode: 这是它的字节码:
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src> javap -c -p Temp$`UselessSupplier
Compiled from "Temp.java"
class Temp$UselessSupplier implements java.util.function.Supplier<java.lang.Object> {
Temp$UselessSupplier();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public java.lang.Object get();
Code:
0: aconst_null
1: areturn
}
It appears that anonymous classes declared in static methods are simply anonymous static classes. 看来静态方法中声明的匿名类只是匿名静态类。
匿名内部类的实例没有对外部类的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.