2013-07-17 11 views
11

私はJavaについての本を読んでいたとき、私はこのように書かれた一例を見ました。私はmainメソッドの外で変数を宣言できますか?変数の外側と内側のmainメソッドの宣言の違いは何ですか?ここで「静的」な役割は何ですか?私に説明する人もいますか?私は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]); 
     } 
    } 

よろしくお願いいたします。

答えて

12

1):あなたがメソッドの内部で、あなたのオブジェクトを宣言すると

、それだけでこの方法で表示されます。基本的に、括弧を囲むと、これらの括弧内からのみ可視/アクセスできます。

あなたは(クラス内)外の方法で、あなたのオブジェクトを宣言した場合、それはaccess modifierに依存します。
デフォルトでは、そのクラスとパッケージ全体から可視/アクセス可能です。このオブジェクト/変数は、クラス自体にではなく、そのオブジェクトに属していることを

2)静的

静的手段。

例:

public class Members { 

    static int memberCount; 

    public Members() { 
    memberCount++; 
    } 
} 

memberCountは関係なく、クラスの多くのオブジェクトが存在するか、一度しか存在しません。

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

3

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

例:

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" 
    } 
} 
+0

同じパッケージ内の他のクラスへのクラス外でも – nachokk

+1

@nachokk:この場合のみ。アクセス指定子によって異なります。 – pratZ

+1

このコードは 'varOne'が静的ではないので、コンパイルされません。静的' main() 'メソッドからはアクセスできません。 – bcsb1001

1

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

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

+0

ありがとうございました。 –

1

違いはan_integerのスコープが増えました。

別の方法がある場合は、例。

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]); 
     } 

     public void anotherMethod(){ 
     an_integer++; 
     } 


    } 

あなたは、同じパッケージに

<default package> int an_integer=0;

すべてclasesを宣言したように、この変数へのアクセス権を持っています。外側対内側

+0

ありがとうございました。 –

+0

あなたは歓迎しています。回答を受け入れることを検討し、あなたを理解できる人をアップヴォーグすることを検討してください:) – nachokk

1

あなたが参照するのは変数の範囲です。

メソッド内の変数は、mainメソッド内のan_integerメソッドは、mainメソッドの外部では参照できません。変数は、explple内部ループのために、より狭いスコープを持つことさえできます。 forループの古典的な反復変数は、そのループ内でのみ使用可能であり、その後、そのループはなくなる。

メソッドの外部の変数はフィールドと呼ばれます。それは、そのアクセス修飾子に依存します。 Privateなどのフィールドは、このクラス内でのみ使用できます。publicフィールドはどこからでもアクセスできます(その他のアクセス修飾子はprotectedであり、noneに設定されています)。基本的には、クラス内のフィールドを使用して、このクラス内のすべてのメソッドからその値にアクセスできますが、複数のスレッドがクラスの同じインスタンスにアクセスする場合は危険ですが、これはまったく別の話です。

フィールドとローカル変数が同じ名前を持つ可能性があり、混乱を招く可能性があります。私は一般的にこれをやっていない方が良いでしょう。あるいは、おそらくもっと良いことに、いつもアクセッサでフィールドを参照してください。私は、ローカル変数と同じ名前のフィールドのどちらが優先されているのかどうかは確かに分かりませんが、どちらが意味されているのかを判断する際にローカル変数が優先されると思います。

Staticフィールドは、この変数がクラスのインスタンスではなく、クラス自体に属していることを意味します。 Staticフィールドを最初に初期化することなく、フィールド(およびメソッド)を読み込む(または呼び出す)ことができます。例としては、クラスの標準値、あるいはファクトリメソッド(メソッドの場合)などがあります。 Staticフィールドは、final修飾子と共に定数のためにも便利です。 public final staticフィールドは大部分のグローバル定数です。

3

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

関連する問題