在我的主类中,我有一个名为Shape的内部类,它扩展了JButton。这个内部类有一个名为CUBE的私有char变量。
我为它写了getters和setter。我注意到在main方法中,而不是使用:
(instance of Shape).getCUBE();
我可以使用以下方式访问它:
(instance of Shape).CUBE
这是否会发生,因为CUBE最终与主要同一类?
是否有必要通过java编程约定为这样的内部类编写getter和setter?
答案 0 :(得分:7)
这是否会发生,因为CUBE最终与主要同一类?
不,它有效,因为语言规范说它确实如此。就JVM而言,它最终将作为一个单独的类,但是将创建额外的包级方法,以允许外部类看起来违反正常规则。
语言规范的相关部分位于6.6.1:
否则,如果成员或构造函数被声明为private,则当且仅当它发生在包含成员声明的顶级类(第7.6节)的主体内时才允许访问或构造函数。
(强调我的。)
实际上,即使 peer 嵌套类也可以访问私有成员。示例代码:
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;
}
}
}
如果查看生成的类(使用javap -c Test$First
和javap -c Test$Second
,您将看到编译器生成的合成方法。
答案 1 :(得分:0)
这是一个模仿你的描述的类:
import javax.swing.JButton;
class Main
{
public class Shape extends JButton
{
private char CUBE = 'I';
public char getCUBE()
{
return CUBE;
}
public void setCUBE(char CUBE){this.CUBE = CUBE;}
}
public static void main(String[] args)
{
Shape sp = new Main().new Shape();
System.out.println(sp.CUBE);
System.out.println(sp.getCUBE());
}
}
public class TestMain
{
public static void main(String[] args)
{
Main.Shape sp = new Main().new Shape();
//System.out.println(sp.CUBE);
System.out.println(sp.getCUBE());
}
}
如果删除注释,则无法编译。因此,如果要在Main之外访问CUBE,则仍需要getter和setter。
答案 2 :(得分:-3)
这样做是因为您忘记添加private
关键字。