当前位置: 首页 > 知识库问答 >
问题:

为什么内部类实例变量不能修改外部类实例变量,而内部类局部变量可以

宋涵忍
2023-03-14

为什么<code>test

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
            }
        }
    }
}

共有1个答案

李星波
2023-03-14

虽然这些行看起来很相似,但它们并不相同:

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.
            }
        }
    }
}

如果要运行代码以在创建 localClassInMethod 的新实例时将值 1 分配给字段测试,请使用实例初始值设定项块:

        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() {
                ...
            }
        }
 类似资料:
  • 问题内容: 为什么我需要声明一个方法,好像我在方法中定义的需要使用它一样? 范例: } 为什么String 需要是最终常量?它如何影响? 问题答案: 答案是两者在不同的范围内。因此该变量可以在内部类访问它之前更改。将其最终确定可以防止这种情况。

  • 问题内容: 如果省略,则会看到错误“ 无法在用其他方法定义的内部类中引用非最终变量jtfContent ”。 为什么匿名内部类必须要求外部类实例变量为final才能访问它? 问题答案: 首先,让我们放松一下,请放下那把枪。 好。现在,语言坚持的原因是它作弊是为了让你的内部类函数可以访问他们渴望的局部变量。运行时复制本地执行上下文(以及其他适当的内容),因此它坚持要求你进行所有操作,final以使事

  • 为什么这段代码不起作用 在这段代码工作的时候? 在第一段代码中,当我试图通过内部类“a”的对象引用内部类“a”的实例变量“x”时,我得到一个错误,说我是在静态上下文中使用内部类。在其他方法中执行相同操作时没有错误。

  • 但是,如果我在内部类中声明了一个同名的variabe呢?有什么方法可以显式引用外部变量吗? 顺便说一句,这和这个问题不同,因为它考虑的是局部堆栈变量。

  • 问题内容: 修改中的局部变量会产生编译错误: 正常 与Lambda 任何想法如何解决这个问题? 问题答案: 任何一种包装纸都是好的。 对于 Java 8+ ,请使用: …或数组: 使用 Java 10+ : 注意: 如果使用并行流, 请 非常小心。您可能无法获得预期的结果。诸如Stuart的其他解决方案可能更适合这些情况。 对于除 当然,这对于之外的其他类型仍然有效。您只需要将包装类型更改为或该类