java - 为什么内部类实例变量不能修改外部类实例变量,而内部类局部变量可以
问题描述
为什么test
变量发生在localClassMethod内部和tt方法之外的编译错误,但在tt方法中编译是可以的。
这意味着内部类实例变量不能修改外部类实例变量,但内部类局部变量可以修改外部类实例变量。
public class Outer {
int test = 0;
void classMethod() {
class localClassInMethod {
int k = test;//compile ok
test = 1;//compile error
public void tt() {
test++;//compile ok
int m = test;//compile ok
}
}
}
}
解决方案
尽管这些线条看起来很相似,但它们并不相同:
public class Outer {
int test = 0; // This is a field declaration, with initializer.
void classMethod() {
class localClassInMethod {
int k = test; // This is a field declaration, with initializer.
test = 1; // This is an assignment statement, and those are only
// valid inside a method body or initializer block.
public void tt() {
test++; // This is a post-increment expression statement.
int m = test; // This is a local variable declaration, with initializer.
test = 2; // Assignment statement is valid here.
}
}
}
}
如果要在创建新实例时运行代码为1
字段赋值,请使用实例初始化程序块:test
localClassInMethod
class localClassInMethod {
int k = test;
{ // Initializer block.
test = 1; // Assignment statement is valid here.
}
public void tt() {
...
}
}
这与将语句放在每个构造函数中相同:
class localClassInMethod {
int k = test;
public localClassInMethod() {
test = 1; // Assignment statement is valid here.
}
public void tt() {
...
}
}
推荐阅读
- python - 如果为空,如何从 numpy 数组/表中删除一行
- wordpress - htaccess 使 url 从 /index.json 以及 /
- java - {Java} Vaadin 14 - 将用户限制为 1(一)个活动 UI
- react-slick - 如何删除内联 CSS 宽度:100%;显示:内联块;从反应光滑
- python - 基于布尔函数合并 Pandas Dataframe
- reactjs - 如何安全地与您的代理服务器确认 SPA 的身份?
- java - 服务中抛出异常时的Spring Boot ExceptionHandler
- mobile - iOS 13 和输入密码
- android-studio - 无法从另一个类更新 TextView
- http - Python 请求挂起,而 CURL 没有(相同的请求)