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();
}
});
}
}
在上面的代码中,我在MediaPlayer
方法中初始化了一个新的onCreate
对象。当我想使用MediaPlayer
对象mediaN
来调用start()
方法时,它会要求我将对象声明为final。但是,如果我将MediaPlayer
对象初始化为类MainActivity
的实例变量,则不会出现任何错误。当MediaPlayer
对象被声明为final
方法的局部变量时,为什么要求将onCreate
对象设为 {
'accession_id' => 'NC_000017.10',
'is_no_call' => bless( do{\(my $o = 0)}, 'JSON::XS::Boolean' ),
'end' => 12344,
'alternate_ids' => [],
'variants' => [
{
'dosage' => '2',
'accession_id' => 'NC_000017.10',
'is_no_call' => $VAR1->[0]{'is_no_call'},
'end' => 12344,
'allele' => 'A',
'platform_labels' => [
'ILMN_CUSTOMv4',
'ILMN_OMNIEXv3_CUSTOMv3'
],
'is_assayed' => bless( do{\(my $o = 1)}, 'JSON::XS::Boolean' ),
'start' => 12343
},
{
'dosage' => '0',
'accession_id' => 'NC_000017.10',
'is_no_call' => $VAR1->[0]{'is_no_call'},
'end' => 12344,
'allele' => 'C',
'platform_labels' => [
'ILMN_CUSTOMv4',
'ILMN_OMNIEXv3_CUSTOMv3'
],
'is_assayed' => $VAR1->[0]{'variants'}[0]{'is_assayed'},
'start' => 12343
}
],
'id' => 'rs6565703',
'is_genotyped' => $VAR1->[0]{'variants'}[0]{'is_assayed'},
'is_assayed' => $VAR1->[0]{'variants'}[0]{'is_assayed'},
'gene_names' => [
'DOC2B'
],
'start' => 12343
}
?
答案 0 :(得分:0)
本地类可以绝对引用实例变量。他们无法引用非最终局部变量的原因是因为本地类实例可以在方法返回后保留在内存中。当方法返回时,局部变量超出范围,因此需要它们的副本。如果变量不是最终的,那么方法中变量的副本可能会发生变化,而本地类中的副本则没有变化,因此它们将不同步。 “Java和最终变量中的匿名类”https://medium.com/@emerino/anonymous-classes-in-java-and-final-variables-1b1830ac480b 这应该有所帮助。