Java 访问内部对象类变量

Java 访问内部对象类变量,java,inner-classes,setter,getter,Java,Inner Classes,Setter,Getter,在我的主类中,我有一个名为Shape的内部类,它扩展了JButton。这个内部类有一个名为CUBE的私有char变量 我为它写了一个接受者和接受者。我注意到在main方法中,没有使用: (instance of Shape).getCUBE(); 我可以通过以下方式访问它: (instance of Shape).CUBE 发生这种情况是因为多维数据集最终与main位于同一个类中吗 java编程约定是否有必要为这样一个内部类编写getter和setter?因为您忘记添加private关键字

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

我为它写了一个接受者和接受者。我注意到在main方法中,没有使用:

(instance of Shape).getCUBE(); 
我可以通过以下方式访问它:

(instance of Shape).CUBE
发生这种情况是因为多维数据集最终与main位于同一个类中吗


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

因为您忘记添加
private
关键字,所以这样做很有效

发生这种情况是因为多维数据集最终与main位于同一个类中吗

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

语言规范的相关章节如下所示:

否则,如果该成员或构造函数被声明为私有,则仅当且仅当它发生在包含该成员或构造函数声明的顶级类(§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
),您将看到编译器生成的合成方法。

这是一个模仿您描述的类:

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之外的多维数据集,您仍然需要getter和setter。

顺便说一句,这不应该是all-caps。不,即使是私有的,也可以访问。非常感谢!按照java约定,是否仍然需要编写getter和setter?是否也希望使用它们与“对象的实例”相反。变量?我真的不确定。我在这两方面都看过很多代码。不过为了清楚起见,我通常会将嵌套类设为私有类(除非它类似于生成器)。