-3

以下のクラスを検討してください

public class Player {

private int id;
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}
}

同じパッケージに別のクラスがあると仮定します

public class Sample {
    Player p1 = new Player();
    Player p2 = new Player();
    Player p3 = new Player();
    Player p4 = new Player();
    //p1.
}

このクラスでは、メソッドp1.setId(int)にアクセスすることは、別のメソッドで呼び出されない限り不可能です。

public class Sample {
    Player p1 = new Player();
    Player p2 = new Player();
    Player p3 = new Player();
    Player p4 = new Player();

    void example () {
        int x;
        p1.setId(x);                
    }
}

例の中でp1.setId()が可能です。Javaが別のメソッド内でのみメソッドへのアクセスを有効にしていることを理解しています。したがって、より安全です。しかし、なぜそのような制限があるのか​​、そしてこの制限でどのような概念データの抽象化またはカプセル化が示されるのかを明確にしたいと思います。前もって感謝します 。

4

4 に答える 4

3

-クラススコープでは、そのような操作はできません。クラススコープでは

-inside a method 、、またはのいずれかである必要がありますinside a block

例えば:

public void go(){     // Inside a method

      p1.setIt(1);

   }

例えば:

{                    // Inside a block

      p1.setIt(1);

  }
于 2012-07-30T07:43:15.703 に答える
3

Javaが別のメソッド内でのみメソッドへのアクセスを有効にしていることを理解しています。したがって、より安全です

それは完全にナンセンスです。

言語の構文規則に問題があるだけです。つまり、クラス本体内では、次の4つしか持つことができません。

ClassMemberDeclaration
InstanceInitializer
StaticInitializer
ConstructorDeclaration

クラス内にコードだけを入れることはできません。それは、クラスの定義方法ではありません。インスタンス初期化子を使用できます。これは機能します:

public class Sample()
{
        Player p1 = new Player();
        Player p2 = new Player();
        Player p3 = new Player();
        Player p4 = new Player();

        {
            p1.setInt(2);
        }
}

ただし、インスタンスの初期化にはコンストラクターの方が適しているため、通常は実行されません。

于 2012-07-30T07:38:52.513 に答える
2

メソッドと変数を定義する必要があるクラスブロックで操作を実行しようとするためです。

このプロパティを本当に設定したい場合は、ブロックを使用してください。

public class Sample() {
    Player p1 = new Player();
    {
        p1.setId(1);
    }
}

コンストラクターから呼び出される初期化メソッドを使用する方が良いと思います。

public class Sample() {
    Player p1 = new Player();
    public Sample() {
        init();
    }
    private init(){
        p1.setId(1);
    }
}
于 2012-07-30T07:35:46.690 に答える
-2

コードに別の間違いがあるかもしれないと思います。クラス名「Sample」の後に括弧を使用するのはなぜですか?

于 2012-07-30T07:38:55.050 に答える