作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我调用方法 doWork 并向它传递一个名为 myString 的参数。在匿名内部 AsyncTask 类中,方法 onPostExecute 定义了另一个具有相同名称的字符串,myString,作为传递给 doWork 的参数。
// 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 会报错。内部发生了什么让编译器接受这个?
最佳答案
您在 onPostExecute
中定义的变量 myString
是方法级局部变量。所以它的作用域就在 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"
}
}
关于java - 匿名内部类中的变量名可以与类外的参数相同。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29887647/
我是一名优秀的程序员,十分优秀!