匿名内部类请求澄清

时间:2011-02-28 18:51:37

标签: java anonymous-types inner-classes

在Android上学习TTS时,我遇到了以下代码段:

    speakBtn.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
        }});

我对Java很陌生,所以我对识别各种结构的信心水平并不高。我认为我上面看到的是Anonymous Inner Class,但是“新的OnClickListener()”让我感到困惑。因此,请确认和/或更正以下任何理解:

  1. 内部类定义正确 在新的OnClickListener()之后。
  2. OnClickListener是一个超类 内在的是哪个 的。
  3. (匿名)内部类只有 一个成员函数:OnClick()。
  4. @Override里面是什么 内部类的定义?如果 这是一个注释,然后我 困惑为this answer州 匿名内部类不能 注释。
  5. 最后,有没有办法以更容易破译像我这样的n00b的方式编写上述代码段?

5 个答案:

答案 0 :(得分:4)

  1. 是;它是在大括号之间定义的。
  2. 是的,除了它是一个界面,而不是一个类。
  3. 您无法添加班级注释 @Override是一个方法级注释,工作正常。

答案 1 :(得分:3)

好吧,基本上这段代码创建了一个类,编译器为了你的方便而破坏了这个名称,这样你就不必在乎自己命名了。该类将实现接口OnClickListener,并包含onClick(View)方法的实现,如接口所需。

因此,您的代码段可能是这样写的:

class OnClickListenerThingy01 implements OnClickListener { // name is invented from the top of my head and corresponds actual name manging in no way
    @Override
    public void onClick(View view) {
        mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
    }
}
speakBtn.setOnClickListener(new OnClickListenerThingy01());

@Override注释没有放在类本身上 - 在代码中没有声明可以添加注释,编译生成 - 但是在方法上。

@Override注释用于标记覆盖(多么令人惊讶)和方法实现。它的主要用途是,如果被覆盖方法的签名发生更改,则会生成编译器错误,但是您无法相应地更新覆盖声明,这样当覆盖失败时,您不会感到非常惊讶,因为,例如,什么是重写被重命名。

如果在接口实现上,如果您忘记完全实现接口,编译器将始终生成错误,因此@Override可能看起来有点多余,但事实并非如此。事实上,如果不必要的方法(例如,从接口中删除方法声明)将不会保留在您的代码中,这是一件相当不错的事情。

虽然必须注意像Eclipse这样的IDE很可能会使这些问题无效,因为提供的重构工具足以避免这种情况。无论如何,@ Override在使用它时可以很方便。

答案 2 :(得分:2)

这是一种重写你的代码片段的方法,使其更加清晰“对菜鸟”:)

class MyOuterClass {
    private class MyOnClickListener implements OnClickListener {
        @Override
        public void onClick(View view) {
            mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
        }
    }

    // later (inside some method)...
        speakBtn.setOnClickListener(new MyOnClickListener());
}

答案 3 :(得分:1)

  • 内部类是在新的OnClickListener()之后定义的。

将代码视为描述OnClickListener()的未命名子类。正如您所想的那样,类定义在括号内。

  • OnClickListener是一个从中派生内部类的超类。

  • (匿名)内部类只有一个成员函数:OnClick()。

确实如此,但事实并非如此。它可以有更多的成员函数。

  • 内部类定义中的@Override是什么?如果这是一个注释,那么我很困惑,因为这个答案表明匿名的内部类不能被注释。

@Override用于对方法进行编译时错误检查。您可以在匿名内部类上使用方法级注释。

答案 4 :(得分:0)

  

OnClickListener是一个超类   内部类派生的

不是真的:OnClickListener不是一个类。 此语法用于创建实现OnClickListener接口的新(匿名)类的实例。所以你只有一种方法可以实现:onClick()。