12

Java に関する本を読んでいたとき、このように書かれた一例を見ました。そして、メインメソッドの外で変数を宣言できるのでしょうか? メインメソッドの外側と内側で変数を宣言することの違いは何ですか? ここでの「静的」の役割は何ですか? 誰か説明してくれませんか?私はJavaが初めてです。

public class Printstuff {
      static int an_integer = 0;
        public static void main(String[] args) {
          int an_integer = 2;
          String[] some_strings = {"Shoes", "Suit", "Tie" };
          an_integer = an_integer - 1;
          some_strings[an_integer] = some_strings[an_integer] +"+++";
          for (int i = 0; i < some_strings.length; i++)
            System.out.println(some_strings[Printstuff.an_integer]);
        }
    }

よろしくお願いします。

4

6 に答える 6

17

1) 内側 vs 外側:

メソッド内でオブジェクトを宣言すると、そのオブジェクトはこのメソッドでのみ表示されます。基本的に、括弧で囲むと、これらの括弧内からのみ表示/アクセスできます。

メソッドの外側(クラスの内側) でオブジェクトを宣言する場合、それはアクセス修飾子に依存します。
デフォルトでは、そのクラスおよびパッケージ全体から表示/アクセスできます。

2) 静的

静的とは、静的メソッド/変数がそのオブジェクト (そのクラスのインスタンス) ではなく、クラス自体に属していることを意味します。

例:

public class Members {

  static int memberCount;

  public Members() {
     memberCount++;
  }
}

memberCountクラスのオブジェクトがいくつ存在しても、一度しか存在しません。(オブジェクトが作成される前であっても!)

の新しいオブジェクトを作成するたびにMembersmemberCountが増加します。これで、次のようにアクセスできます。Members.memberCount

于 2013-07-17T12:56:38.833 に答える
4

メイン メソッドで変数を宣言すると、メインでのみ使用できるようになります。外部で変数を宣言すると、メイン メソッドを含むクラスのすべてのメソッドで使用できるようになります。

例 :

public class Foo {
   private String varOne = "Test";

   public void testOne() {
     System.out.println(varOne);
     System.out.println(varTwo); // Error, this variable is available in the testTwo method only
   }

   public void testTwo() {
     String varTwo = "Bar";
     System.out.println(varOne); // Will display "Test"
     System.out.println(varTwo); // Will display "Bar"
   }
}
于 2013-07-17T12:48:28.907 に答える
2

誰もメモリの問題に言及していないことに興味をそそられます。何年も前は、main() 内でインスタンス化すると変数がスタックに割り当てられ、メイン外でインスタンス化すると変数がヒープに割り当てられました。当時、システムのスタックは非常に小さかったため、この詳細を確認しないと、スタック オーバーフローが非常に簡単に発生します。私はメモリ アーキテクチャの専門家ではありませんが、現在の SW アーキテクチャ / メモリに適用されるこの微妙な詳細に誰かが貢献してくれることを願っています。

于 2015-06-15T17:59:55.610 に答える
1

あなたが参照するのは、変数のスコープです。

メソッド内の変数は、このメソッド内でのみアクセスできます。つまりan_integer、-method 内mainではメソッド外で参照できませんmain。変数は、ループ内など、より狭いスコープを持つこともできます。ループの古典的な繰り返し変数は、forそのループ内でのみ使用でき、その後はなくなります。

メソッド外の変数はフィールドと呼ばれます。アクセス修飾子が表示される場所によって異なります。Privateたとえば、フィールドはこのクラス内でのみ利用可能であり、publicフィールドはどこからでもアクセスできます (他のアクセス修飾子はprotectedありません。デフォルトにフォールバックします)。基本的に、クラス内のフィールドを使用して、このクラス内のすべてのメソッドからその値にアクセスできます。ただし、複数のスレッドがクラスの同じインスタンスにアクセスする場合、これは危険な場合がありますが、これはまったく別の話です。

フィールドとローカル変数が同じ名前を持つ場合があり、混乱を招く可能性があります。私は通常、これを行わないことを好みます。または、より良いのは、常にthisアクセサーを使用してフィールドを参照することです。同じ名前のフィールドに対してローカル変数の優先順位があるかどうかは完全にはわかりませんが、どちらが意図されているかを判断する際には、ローカル変数の方が優先度が高いと思います。

Staticfields は、この変数がクラスのインスタンスではなく、クラス自体に属していることを意味します。Static最初にクラスを初期化することなく、フィールド (およびメソッド) を読み取る (または呼び出す) ことができます。例としては、クラスの標準値、または factorymethod (メソッドの場合) が考えられます。フィールドは、修飾子Staticと一緒に定数にも役立ちます。finalフィールドはpublic final staticほとんどグローバル定数です。

于 2013-07-17T13:18:05.810 に答える
1

範囲の違いがあります。メイン関数は静的であるため、静的として宣言する必要があり、静的変数のみを使用できます。メイン メソッド内で宣言する変数は、メイン メソッド内でのみ使用されます。

ここで、なぜ main メソッドを static にする必要があるのか​​疑問に思うかもしれません!!! Javaのアプリケーションはメインメソッドから実行されるため、オブジェクトを作成せずにクラス名のみで呼び出すことができるため、静的として定義しています。すべての静的メソッドはクラス参照で呼び出すことができ、オブジェクトは必要ありません。

于 2013-07-17T12:48:51.237 に答える