Java 静态方法中的匿名类,包含对什么的引用?
另外,在Java中,匿名内部类始终包含对其外部类的封闭实例的引用。现在,当我将匿名类放入静态方法中时会发生什么?由于没有外部类的对象,它是否持有对调用静态方法的类的引用?我在这里有点困惑。考虑下面的Android示例(使用PARSEM框架):Java 静态方法中的匿名类,包含对什么的引用?,java,android,memory-leaks,static-methods,anonymous-inner-class,Java,Android,Memory Leaks,Static Methods,Anonymous Inner Class,另外,在Java中,匿名内部类始终包含对其外部类的封闭实例的引用。现在,当我将匿名类放入静态方法中时会发生什么?由于没有外部类的对象,它是否持有对调用静态方法的类的引用?我在这里有点困惑。考虑下面的Android示例(使用PARSEM框架): 公共类联机查询{ 公共静态无效查询用户(最终监听器接口监听器){ ParseQuery=User.getQuery(); findInBackground(新的FindCallback(){ @凌驾 公共作废完成(最终列表userList,Parsee){
公共类联机查询{
公共静态无效查询用户(最终监听器接口监听器){
ParseQuery=User.getQuery();
findInBackground(新的FindCallback(){
@凌驾
公共作废完成(最终列表userList,Parsee){
reportBackToCallingActivity();
//这里有哪一类作为参考?
}
});
}
}
公共类MainActivity扩展活动实现OnlineQuery.ListenerInterface{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OnlineQuery.queryUsers(此)
}
...
}
另外,使用示例中所示的侦听器是否是关于内存泄漏的错误做法?
谢谢 匿名内部类的实例没有对外部类的引用。我创建了一个一次性类(它是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) {}
}
以下是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) {}
}
导入java.util.function.Supplier;
/*临时方案*/
公共类临时工
{
静态类Uselessupplier实现供应商
{
@凌驾
公共对象get()
{
返回null;
}
}
公共静态void main(字符串…参数){}
}
下面是它的字节码:
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
}
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src>javap-C-p Temp$`uselessupplier
从“Temp.java”编译而来
类Temp$uselessupplier实现java.util.function.Supplier{
Temp$uselessupplier();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
public java.lang.Object get();
代码:
0:aconst_null
1:轮到你了
}
在静态方法中声明的匿名类似乎只是匿名静态类。根据
javap
,它们确实是。我的类CollatzSequence
中匿名迭代器的字节码包含final collatz.CollatzSequence这一行$0代码>,就像任何其他内部类一样(请参阅)。
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
}