【问题标题】:Why inner class instance variable can't mofidy the outer class instance variable,but the inner class local variable can为什么内部类实例变量不能修改外部类实例变量,而内部类局部变量可以
【发布时间】:2020-04-07 12:55:10
【问题描述】:

为什么test变量在localClassMethod内部和tt方法外部出现编译错误,但在tt方法编译是ok的。 表示内部类实例变量不能修改外部类实例变量,但内部类局部变量可以修改外部类实例变量。

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

【问题讨论】:

  • 不,你可以看到它编译正常并且方法内部的内部类。
  • 你不能在类主体(外部函数)中设置任何东西(除了声明)。
  • 哇,直到现在我才知道你可以在方法中放置一个类!
  • @rockwe 原因是 Java 设计者决定如何设计该语言。一个类包含字段声明、静态和初始化块、构造函数和方法。不是随机的可执行指令。这些进入方法、构造函数和初始化块。
  • @Sweeper 是的!我相信他们被称为local classes

标签: java anonymous-inner-class


【解决方案1】:

虽然线条看起来很相似,但它们并不相同:

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 分配给字段 test,请使用实例初始化程序块:

        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() {
                ...
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2012-12-17
    • 2016-12-19
    相关资源
    最近更新 更多