Variable 'i' is accessed from within inner class, needs to be final or effectively final
时间: 2023-10-13 14:25:58 浏览: 153
member name cannot be accessed(解决方案).md
这个错误意味着你在内部类中访问了一个外部类的变量,但是该变量没有被声明为 final 或 effectively final。
Java 中,内部类访问外部类的变量时,这些变量必须是 final 或 effectively final。一个变量被称为 effectively final,如果它在初始化后没有被修改过,即使它没有被声明为 final。
为了解决这个问题,你可以将变量声明为 final 或 effectively final。如果你需要在内部类中修改该变量的值,你可以将该变量转换为一个包含在一个对象中的属性,然后将该对象声明为 final 或者 effectively final。
以下是一个示例代码:
```java
public class OuterClass {
public void doSomething() {
int i = 0;
final int j = 0; // 声明为 final
class InnerClass {
public void doSomething() {
System.out.println(i); // 编译错误
System.out.println(j); // 可以访问
}
}
}
}
```
```java
public class OuterClass {
public void doSomething() {
int i = 0;
class InnerClass {
public void doSomething() {
final int j = 0; // 声明为 effectively final
System.out.println(i); // 编译错误
System.out.println(j); // 可以访问
}
}
}
}
```
```java
public class OuterClass {
public void doSomething() {
class InnerClass {
private final int i; // 包含在一个对象中的属性
public InnerClass(int i) {
this.i = i;
}
public void doSomething() {
System.out.println(i); // 可以访问
}
}
InnerClass innerClass = new InnerClass(0); // 声明为 final 或 effectively final
}
}
```
阅读全文