1

ここで簡単な質問があります。次のように、メインクラスで[宣言]されたオブジェクト内で変数を宣言すると:

public static int number;

(通常、私は次のように宣言します:

private int number;

)

メインクラスでも[宣言]された別のオブジェクトで使用できますか? ところで、私はセキュリティ ATM を気にしません。何かを機能させたいだけで、保護は気にしません)

4

4 に答える 4

5

Java言語仕様からの引用は次のとおりです。

JLS 8.3.1.1staticフィールド

フィールドが宣言されている場合、static最終的に作成されるクラスのインスタンスの数 (場合によってはゼロ) に関係なく、フィールドの具体化は 1 つだけ存在します。クラス変数staticと呼ばれることもあるフィールドは、クラスが初期化されるときに具体化されます。

宣言されていないフィールドstatic(非staticフィールドと呼ばれることもあります) は、インスタンス変数と呼ばれます。クラスの新しいインスタンスが作成されるたびに、そのインスタンスに関連付けられた新しい変数が、そのクラスまたはそのスーパークラスで宣言されたすべてのインスタンス変数に対して作成されます。

[サンプルプログラムは以下のとおりです...]

つまり、staticフィールドはクラス変数です。クラスのインスタンスではなく、クラスに属します。ある意味では、フィールドをクラスのインスタンスによって共有される変数と考えることができますが、 メソッドもクラスに属しているように、フィールドをクラスに属しているstaticと考える方がはるかに一貫性があります。staticstatic

それらはクラスに属しているため、そのクラスのインスタンスにアクセスする必要はありません (適切な可視性を前提としています)。実際static、型式ではなくインスタンスを介してメンバーにアクセスすることは、プログラミングの悪い方法と見なされています。

関連する質問

于 2010-05-09T17:37:41.963 に答える
0

ここには実際には 2 つの問題があります。内部クラスのコンテキストでのパブリックとプライベート、および静的変数です。

パート1:

staticは、その変数にアクセスするためにクラスのインスタンスが必要ないことを意味します。次のようなコードがあるとします。

class MyClass {
 public static String message = "Hello, World!";
}

次の方法でプロパティにアクセスできます。

System.out.println(MyClass.message);

staticキーワードを削除する場合は、代わりに次のようにします。

System.out.println(new MyClass().message);

newキーワードによって作成されたクラスのコピーであるinstanceのコンテキストでプロパティにアクセスしています。

パート2:

同じ Java ファイルで 2 つのクラスを定義する場合、そのうちの 1 つは内部クラスでなければなりません。内部クラスは、プロパティと同様にstaticキーワードを持つことができます。staticの場合、個別に使用できます。静的でない場合は、クラス インスタンスのコンテキストでのみ使用できます。

元:

class MyClass {
 public static class InnerClass {
 }
}

次に、次のことができます。

new MyClass.InnerClass();

「静的」がなければ、次のものが必要になります。

new MyClass().new InnerClass(); //I think

内部クラスがstaticの場合、外部クラスの静的プロパティにのみアクセスできます。内部クラスが静的でない場合、任意のプロパティにアクセスできます。内部クラスは、 publicprotected、またはprivateの規則を尊重しません。したがって、以下は合法です。

class MyClass {
 private String message;

 private class InnerClass {
  public InnerClass() {
   System.out.println(message);
  }
 }
}

内部クラスにキーワードstaticがある場合、メッセージは静的ではないため、これは機能しません。

于 2010-05-09T17:51:41.860 に答える
0

static変数は、特定のクラスのすべてのインスタンスで共有されます。の場合public、すべてに表示されます。非静的変数は 1 つのインスタンスのみに属します。

mainメソッドはであるため、変数staticのみを表示できstaticます。ただし、静的に作業することは避けてください。クラスのインスタンスを作成し、データを変数を介して共有するのではなく、メソッド/コンストラクターのパラメーターとして渡しstaticます。

于 2010-05-09T17:31:43.363 に答える
0

「番号」を保持するクラスが MyClass と呼ばれる場合、任意のメソッドから MyClass.number として参照できます。

ただし、変数に対してそうするのは良い設計ではありません。

于 2010-05-09T17:40:51.890 に答える