Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态方法中的匿名类,包含对什么的引用?_Java_Android_Memory Leaks_Static Methods_Anonymous Inner Class - Fatal编程技术网

Java 静态方法中的匿名类,包含对什么的引用?

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){

另外,在Java中,匿名内部类始终包含对其外部类的封闭实例的引用。现在,当我将匿名类放入静态方法中时会发生什么?由于没有外部类的对象,它是否持有对调用静态方法的类的引用?我在这里有点困惑。考虑下面的Android示例(使用PARSEM框架):

公共类联机查询{
公共静态无效查询用户(最终监听器接口监听器){
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
}