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