访问内部对象类变量

Zen*_*nos 3 java getter setter inner-classes

在我的主类中,我有一个名为Shape的内部类,它扩展了JButton.这个内部类有一个私有char变量,其名称为CUBE.

我为它写了getters和setter.我注意到在main方法中,而不是使用:

(instance of Shape).getCUBE(); 
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方式访问它:

(instance of Shape).CUBE
Run Code Online (Sandbox Code Playgroud)

这是否会发生,因为CUBE最终与主要同一类?

是否有必要通过java编程约定为这样的内部类编写getter和setter?

Jon*_*eet 7

这是否会发生,因为CUBE最终与主要同一类?

不,它有效,因为语言规范说它确实如此.就JVM而言,它最终将作为一个单独的类,但将创建额外的包级方法,以允许外部类看起来违反正常规则.

语言规范的相关部分在6.6.1中:

否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问.

(强调我的.)

实际上,即使是对等嵌套类也可以访问私有成员.示例代码:

public class Test {

    public static void main(String[] args) {
        First first = new First(10);
        Second second = new Second(first);
        System.out.println(second.getValueFromFirst());
    }

    private static class First {        
        private final int value;

        private First(int value) {
            this.value = value;
        }
    }

    private static class Second {
        private final First first;

        private Second(First first) {
            this.first = first;
        }

        private int getValueFromFirst() {
            return first.value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果查看生成的类(使用javap -c Test$First,javap -c Test$Second您将看到编译器生成的合成方法).