【问题标题】:Why can't I access local class outside declaring method?为什么我不能在声明方法之外访问本地类?
【发布时间】:2018-03-07 03:22:40
【问题描述】:

我最近遇到了一种罕见但完全合法的语法:Local Classes

我想知道为什么我不能访问该方法之外的本地类?它与可以在外部类或封闭对象(outer.new Inner())中访问的内部类有什么不同?

示例:这是完全有效的,

//this is valid
public class Outer {
    int outer_x = 100;

    public void test() {
        Inner inner = new Inner();
        inner.display();

    }

    public class Inner {
        public void display() {
            System.out.println("Outer x is: " + outer_x);
        }
    }
}

这也是有效的

 //this is valid as well
public class Outer {
    int outer_x = 100;

    public void test() {
        Inner inner = new Inner();
        inner.display();
    }

    public class Inner {
        public void display() {
            System.out.println("Outer x is: " + outer_x);
        }
    }

    public void test2() {

        Inner inner2 = new Inner();
        inner2.display();
    }
}

但这不会编译:

public class Outer {
    int outer_x = 100;

    public void test() {

        class Inner {

            public void display() {
                System.out.println("Outer x is: " + outer_x);
            }
        }
        Inner inner = new Inner();
        inner.display();

    }

    public void test2() {

        Inner inner2 = new Inner(); // error here
        inner2.display();
    }
}

为什么会这样?

【问题讨论】:

  • 因为您无法访问仅在另一个方法中定义的类。你必须给它范围。
  • 我知道!我的问题是“为什么”。
  • @EFFKAY 与inner 声明的方法之外无法访问的原因相同。范围。
  • @smac89 啊,but you can.
  • 一个仅限于方法的范围,因为那是你声明它的地方。

标签: java nested inner-classes


【解决方案1】:

因为每次调用test() 都会创建一个完整的新版本的类。因此它可以访问(最终的或有效的最终的)局部变量!

下面是正在发生的事情的概要。

public class Outer {

    public void test(int i) {
        class Inner {
            private int x = i; // i may be different on each call of test

            public void display() {
                System.out.println("Inner x is: " + x);
            }
        }
        Inner inner = new Inner();
        inner.display();
    }

    public void test2() {
        test(1); // prints 1
        test(2); // prints 2

        //now imagine this is valid
        Inner inner2 = new Inner();
        inner2.display();// what's the value of x??
    }
}

【讨论】:

  • 因为每次调用 test() 都会创建一个完整的新版本的类。 并非如此。这是一个用不同值实例化的类。有点像内部类是如何通过对其外部类的实例的引用来实例化的。但是很好地证明了为什么本地类是作用域的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2019-12-22
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
相关资源
最近更新 更多