[英]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$0
, WrapperClass$1
等...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.