我调用方法doWork并向其传递一个名为 myString 的参数。在匿名内部AsyncTask类中,onPostExecute方法定义另一个具有相同名称
// Note the parameter variable name (i.e. myString)
private void doWork(final String myString) {
AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, String>() {
@Override
protected void onPostExecute() {
// Why is this declaration allowed?
String myString = "myString";
}
}.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
为什么Java允许这样做?通常,如果您定义一个名称已存在于同一范围内的变量,Java会抱怨。内部会发生什么使编译器接受这个?
答案 0 :(得分:7)
您在myString
中定义的变量onPostExecute
是方法级局部变量。所以它的范围只是在onPostExecute
方法内,而不在它之外。
因此,它不会冲突/干扰您在方法onPostExecute
之外定义的早期变量。
这是一个非常简单的解释。
编辑:进一步说明
让我们举个例子,它可以帮助你清除疑虑。
class MyClass{
public String myString = "class level string";
public void test(String testString){
String myString = "method level string";
// you have shadowed the class level variable by defining a method-level local variable.
System.out.println(myString); // will print "method level string"
}
}