匿名内部类中的变量名称可以与类外部的参数相同。为什么?

时间:2015-04-27 05:12:31

标签: java android

我调用方法doWork并向其传递一个名为 myString 的参数。在匿名内部AsyncTask类中,onPostExecute方法定义另一个具有相同名称 myString 的String,作为传递给doWork的param。

// 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会抱怨。内部会发生什么使编译器接受这个?

1 个答案:

答案 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"
    }
}