【问题标题】:Access control modifiers in local classes - why don't they work? [duplicate]本地类中的访问控制修饰符 - 为什么它们不起作用? [复制]
【发布时间】:2016-11-20 22:51:56
【问题描述】:

我在一个方法中声明了一个本地类,其字段被声明为私有。但是,我仍然可以直接从封闭方法的主体中访问它们——这是为什么呢?

作为旁注,我已将匿名类中的所有字段声明为私有,但这样做实际上有什么好处吗?有什么东西可以访问它们吗?

编辑:代码示例

public void myMethod() {

    class myException extends SomeOtherException{
        private boolean Bool;

        public Boolean getBool() { return this.Bool; }

        public myException() { //constructor stuff }
    }

    try {
        Thing.setHandler(new HandlingClass() {
            private String myString; //What is the point in making these private?

            ... other methods in anonymous class ...
        }
    ... more code ...
    } catch (myException e) {
        ... e.Bool  //Can be accessed. Why?
    }
}

【问题讨论】:

  • 制作myString 私人没有任何目的;反射行为略有不同(如果安装了 SecurityManager)。请注意,您可以这样做new HandlingClass() { ... }.myString

标签: java access-control anonymous-class local-class


【解决方案1】:

之所以访问它是因为它的访问方式类似于嵌套类。根据您的方法,本地类属性是可见的,如果它是嵌套类,它将是相同的。

这是本地类的 java 文档中的一个片段:

访问封闭类的成员

本地类可以访问其封闭类的成员。

此外,本地类可以访问本地变量。然而,一个 local 类只能访问声明为 final 的局部变量。 当一个局部类访问一个局部变量或参数时 封闭块,它捕获该变量或参数。例如, PhoneNumber 构造函数可以访问局部变量 numberLength 因为它被宣布为最终的; numberLength 是一个捕获的变量。

但是,从 Java SE 8 开始,本地类可以访问本地 封闭块的变量和参数是最终的或 有效地最终。一个变量或参数,其值从不 初始化后更改实际上是最终的。

https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 2013-04-16
    • 2016-10-11
    • 2011-05-25
    • 1970-01-01
    • 2011-08-27
    • 2013-03-13
    • 2011-04-12
    相关资源
    最近更新 更多