簡體   English   中英

靜態方法中的匿名類,持有什么參考?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM