3

メイン クラスには、JButton を拡張する Shape という内部クラスがあります。この内部クラスには、CUBE という名前のプライベート char 変数があります。

そのためのゲッターとセッターを書きました。以下を使用する代わりに、メインメソッドで次のことに気付きました。

(instance of Shape).getCUBE(); 

次を使用してアクセスできます。

(instance of Shape).CUBE

これは、CUBE が最終的にメインと同じクラスにあるために発生するのでしょうか。

このような内部クラスのゲッターとセッターを作成することは、Java プログラミング規則によって必要ですか?

4

3 に答える 3

7

これは、CUBE が最終的にメインと同じクラスにあるために発生するのでしょうか。

いいえ、言語仕様で動作すると書かれているため動作します。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 に答える