Java覆盖方法在函数调用内部

时间:2017-01-11 15:58:34

标签: android android-seekbar

我有一段我想要了解的代码,这是一个基于Java-Android的。

     volumeControl.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
        }

    });

在这段代码中,在括号内完成了@Override方法,这是执行此代码的最佳方法,以及如何完成此操作。

  • java编译器如何理解这个构造函数调用。

  • 有一个名为progress的int变量,它获取它的值,函数调用是如何完成的。

2 个答案:

答案 0 :(得分:1)

在Android中有两种方法可以实现接口(在java中)。与您一样(匿名实施)或者您可以将implements OnSeekBarChangeListener添加到您的班级签名中。当您使用类实现接口时,所有这些方法都将成为您的类方法。然后,您可以调用volumeControl.setOnSeekBarChangeListener(this),因为您的类实例正在实现所需的接口。

我认为两种实现方法的代码可读性都没有任何其他区别。

但请记住,当您想在匿名实现中使用方法变量时,应将它们声明为 final

public class SeekBarTestActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_seek_bar_test);

        SeekBar seekbar = (SeekBar) findViewById(R.id.seekBar);
        seekbar.setOnSeekBarChangeListener(this);
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
        // TODO add your implementation here
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO add your implementation here
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO add your implementation here
    }
}

答案 1 :(得分:0)

它的工作方式是该方法应该是一个实现OnSeekBarChangeListener的类。

在volumeControl对象中,引用将保留给Listener。

每当volumeControl必须通知监听器时,它将使用该引用,这样就会通知监听器。

在这个特定的例子中,不是单独创建一个实现Listener的类,而是提供一个匿名内联实现。

这是在Swing或Android开发中处理此问题的非常典型的方法。它非常丑陋,但总是那样。

幸运的是Java 8打开了更好的方法来处理它(最后!!),这要归功于函数式编程,lambda,以及更通用的术语“函数指针”。

编辑(还不能写评论),作为评论的答案,请参阅 Function Pointers in Java