3

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

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

(instance of Shape).getCUBE(); 

我可以通过以下方式访问它:

(instance of Shape).CUBE

发生这种情况是因为 CUBE 最终与 main 属于同一类吗?

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

4

3 回答 3

7

发生这种情况是因为 CUBE 最终与 main 属于同一类吗?

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

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

否则,如果成员或构造函数被声明为私有,则当且仅当它发生在包含成员或构造函数声明的顶级类(第 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;
        }
    }
}

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

于 2012-05-13T18:10:01.987 回答
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。

于 2012-05-13T19:08:43.983 回答
-3

之所以有效,是因为您忘记添加 private关键字。

于 2012-05-13T18:06:47.453 回答