什么新Foo(酒吧){public void baz(){....}};用Java表示?

时间:2013-07-21 22:09:05

标签: java android methods instantiation sample

我正在尝试了解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()
        }
    };

在实例化后立即调用这些方法?我不熟悉这种语法。这是如何运作的? 感谢

2 个答案:

答案 0 :(得分:3)

这是一个匿名的内部类。给定具有0或更多抽象方法的接口或类Foo,您可以使用:

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

使用已实现或覆盖的方法创建Foo实例。所有抽象方法(其中可能有0)都需要在大括号中实现。仍然像往常一样调用构造函数,并且可以在括号中传递参数。

这些通常用于需要运行的侦听器或其他对象,并且应该指定不同的操作,而不创建扩展或实现它们的新类。

对于代码中使用的每个匿名内部类,这些将编译为[Outer Class]$[Number].class,即使从未达到任何内容类或任何多次使用

答案 1 :(得分:1)

可以使用该语法覆盖一个特定实例的类的方法。一个非常常见的用法确实是Listeners或Handlers(例如:MouseListener,KeyListener等)。

这会导致您正在扩展的类的匿名子类。子类没有名称。并编译为WrapperClass$0WrapperClass$1等等......