Java 为什么MediaPlayer API应该声明为全局实例变量?

Java 为什么MediaPlayer API应该声明为全局实例变量?,java,android,Java,Android,在上面的代码中,我在onCreate方法中初始化了一个新的MediaPlayer对象。当我想使用MediaPlayer对象media调用start()方法时,它要求我将对象声明为final。但是,如果我将MediaPlayer对象初始化为类MainActivity的实例变量,则不会出现任何错误。当onCreate方法将MediaPlayer对象声明为局部变量时,为什么要求我将其作为final对象?局部类可以非常明确地引用实例变量。它们无法引用非最终局部变量的原因是,在方法返回后,局部类实例可以保

在上面的代码中,我在
onCreate
方法中初始化了一个新的
MediaPlayer
对象。当我想使用
MediaPlayer
对象
media
调用
start()
方法时,它要求我将对象声明为final。但是,如果我将
MediaPlayer
对象初始化为类
MainActivity
的实例变量,则不会出现任何错误。当
onCreate
方法将
MediaPlayer
对象声明为局部变量时,为什么要求我将其作为
final
对象?

局部类可以非常明确地引用实例变量。它们无法引用非最终局部变量的原因是,在方法返回后,局部类实例可以保留在内存中。当方法返回时,局部变量超出范围,因此需要它们的副本。如果变量不是final,那么方法中变量的副本可能会更改,而本地类中的副本不会更改,因此它们将不同步。 “Java中的匿名类和最终变量” 这应该会有所帮助

public class MainActivity extends AppCompatActivity {     
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button play = (Button)findViewById(R.id.playButton);
        MediaPlayer mediaN = MediaPlayer.create(this, R.raw.master6);
        play.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                mediaN.start();
            }
        });
    }
}