簡體   English   中英

新的Foo(bar)是什么{public void baz(){…}}; 在Java中意味着什么?

[英]What does new Foo(bar) {public void baz(){…} }; mean in Java?

我試圖了解Android SDK的NavigationDrawer示例,並且遇到了這個問題:

 ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
            this,                  /* host Activity */
            mDrawerLayout,         /* DrawerLayout object */
            R.drawable.ic_drawer,  /* nav drawer image to replace 'Up' caret */
            R.string.drawer_open,  /* "open drawer" description for accessibility */
            R.string.drawer_close  /* "close drawer" description for accessibility */
            ) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    };

實例化之后,何時調用這些方法? 我對這種語法不熟悉。 這是如何運作的? 謝謝

這是一個匿名內部類。 給定具有0個或更多個抽象方法的接口或類Foo,可以使用:

Foo blech=new Foo(){
    void bar(int baz){
        System.out.println("quux");
    }
}

用實現或重寫的方法創建Foo實例。 所有抽象方法(可能有0個)都需要在花括號中實現。 仍然照常調用構造函數,並且可以在括號中傳遞參數。

它們通常用於偵聽器或需要運行的其他對象,並且應指定不同的操作,而無需創建擴展或實現它們的新類。

這些將編譯為[Outer Class]$[Number].class ,對於代碼中使用的每個匿名內部類而言,一次編譯一次,即使從未達到或多次使用過

通過使用該語法,可以為一個特定實例覆蓋類的方法。 實際上,非常常見的用法是偵聽器或處理程序(例如:MouseListener,KeyListener等)。

這將導致您擴展的類的匿名子類。 子類沒有名稱。 並被編譯為WrapperClass$0WrapperClass$1等...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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