[英]Anonymous class in static method, holds reference to what?
Afaik,在Java中,匿名內部類總是擁有對其外部類的封閉實例的引用。 現在當我在靜態方法中放入一個匿名類時會發生什么? 由於它的外部類沒有對象,它是否包含對調用靜態方法的類的引用? 我在這里有點困惑。 考慮下面的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)
}
...
}
另外,正在使用一個監聽器,如示例中關於內存泄漏的錯誤做法所示? 謝謝!
我創建了一個小的一次性類(它是Java 9,但我懷疑它有所不同)並使用javap
來反匯編它,顯然它們沒有顯式聲明包含對外部類的引用的字段,這與實例方法中的匿名類不同。
這是源代碼:
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) {}
}
這是匿名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
}
這是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) {}
}
這是它的字節碼:
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
}
看來靜態方法中聲明的匿名類只是匿名靜態類。
匿名內部類的實例沒有對外部類的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.