不确定这个java代码示例中发生了什么

时间:2014-03-12 21:18:43

标签: java android class methods override

我所指的代码示例是一些Android特定代码,但我感觉这个想法是Java中的一个基本代码。在下面的代码片段中,我对第二行发生的事情感到困惑。看起来在setOnClickListener()方法中定义了一个全新的类。在我看来,方法是在另一个方法的参数中定义的,onClick()是在setOnClickListener()中定义的。这一切对我来说非常混乱,因为我从来没有见过像这样写的Java,除了在Android中。

有人可以解释我在这里看到的内容吗?非常感谢任何帮助!

final Button downButton = (Button) findViewById(R.id.button1);
downButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        //Play key click sound
        mAudioManager.playSoundEffect(AudioMAnager.FX_KEY_CLICK);

        if (mVolumne > mVolumeMin) {
            mVolume -= 2;
            tv.setText(String.valueOf(mVolume));
        }
    }
});

3 个答案:

答案 0 :(得分:3)

setOnClickListener()中,正在定义一个新类。它就是所谓的匿名类。匿名类用于定义快速新类型,这些新类型对每个方法调用执行特定和不同的操作,例如对单击执行的操作。匿名类总是隐式地扩展花括号从对象的新实例中脱离的类。为了使这更容易理解:new OnClickListener() {...OnClickListener是新匿名类的超类(或接口)。

在您的情况下,OnClickListener是一个接口,因此您必须将该接口中定义的函数实现到您的匿名类中。然后,当您的操作发生时,在函数中调用该实现的方法。 Java的Swing库也大量使用匿名类。

所以为了回答你的问题,正在发生的是正在创建一个新类,它只用于此方法调用 - 该类在其他任何地方都不可见(或可用)。总之,匿名类允许您从指定的类或接口创建自己的自定义类型。它可以让您轻松完成许多事情,并在您的行动中拥有专长。

答案 1 :(得分:2)

代码正在创建一个匿名内部类。 (谢谢,大卫。)基本上,它正在创建OnClickListener类的新实例。该类有许多方法,包括onClick(View v)。该类“监听”以查看在发生单击时会发生什么,并调用onClick方法。但是,该方法没有做任何事情。使它做某事的唯一方法是创建这个类的新实例,并将该方法定义为执行某些操作。

答案 2 :(得分:1)

单击按钮onClick()函数被调用

AudioManager提供对音量和振铃模式控制的访问。

int FX_KEY_CLICK:键盘和方向键点击声音

因此,当按下键盘键时,此行将播放键的声音。

然后if循环很容易打印声音值