2016-09-20 26 views
6

これは本当に基本的な質問かもしれませんが、私のJava学習のこの段階で私を困惑させます。 私は次のコードを持っている:私はArrayListオブジェクトとメソッド外のオブジェクトに関する呼び出しをインスタンス化ラインを移動する場合は、オブジェクトを作成する行が細かいクラス内からメソッド内でメソッドを呼び出す方法

package com.soti84; 

    import java.util.ArrayList; 

    public class InvokeMethod { 

    public static void main(String[] args) { 

    ArrayList<String> exams= new ArrayList<String>(); 
    exams.add("Java"); 
    exams.add("C#");  

    }   

    } 

が、アドオン()オブジェクトに対するメソッド呼び出しは許可されません。何故ですか?

package com.soti84; 

    import java.util.ArrayList; 

    public class InvokeMethod { 
    ArrayList<String> exams= new ArrayList<String>(); 
    exams.add("Java"); 
    exams.add("C#");  

    public static void main(String[] args) { 

    } 

    } 

ありがとうございます。

+0

[初期化ブロックとは何ですか?](http://stackoverflow.com/questions/3987428/what-is -an-initialization-block) – blackpen

答えて

3

あなたは単にメソッドの外でそのコードを行うことはできません。これを行うには、イニシャライザブロックまたはスタティックブロックが必要です。

public class InvokeMethod { 
    ArrayList<String> exams= new ArrayList<String>(); 
    { 
     exams.add("Java"); 
     exams.add("C#"); 
    } 

このブロックは、インスタンスを作成するときに実行されます。変数が静的だった場合は、そのブロックを静的にすることができます(そのブロックの前にstaticを追加するだけです)。静的ブロックは、クラスの初期化時に実行されます。これらのブロックは、静的な静的リスト/マップが必要なときに非常に便利です。もちろん、プログラミングに便利なことはすべて、おそらく悪い習慣であり、ここでは、それらのブロックが一部の人にぶち壊されてしまい、かなり危険なことがあり、見つからないバグ(主に実行の順番)につながる可能性があります。上記の行は、あなたがオブジェクトのプロパティとしてそれを宣言していることを意味し

ArrayList<String> exams= new ArrayList<String>(); 

「あなたは関数/メソッドの外からそれを呼び出している」ためだ

+0

徹底的な回答をいただきありがとうございます(特にWhatzs)。 – soti84

0

。これはメソッド内でのみアクセスできることを意味します。

あなたは法の外「試験」を宣言したが、これは、うまく動作するはず自分のメイン

exams.add("Java"); 
exams.add("C#"); 

に次のように配置するつもりなら。

1

2つの例では、全く異なる2つのことを達成しようとしています。

最初の例ではmainメソッドの中にArrayListと宣言していますので、リストのスコープはこのメソッドだけになります。囲むクラスは、それと全く接続していません。ArrayList

InvokeMethodexamsという名前のデータメンバーを作成しようとしました。つまり、このクラスのすべてのインスタンスは独自のリストを持ちます。

「メソッドの外に」宣言と初期化のみが行われるため、要素の追加は機能しません。

public class InvokeMethod { 
    ArrayList<String> exams = new ArrayList<String>(); 
    { 
     exams.add("Java"); 
     exams.add("C#"); 
    } 

    public static void main(String[] args) { 
    } 
} 

や、クラスのコンストラクタ:

public class InvokeMethod { 
    ArrayList<String> exams = new ArrayList<String>(); 

    public InvokeMethod() { 
     exams.add("Java"); 
     exams.add("C#"); 
    } 

    public static void main(String[] args) { 

    } 
} 

注:これを修正するには、あなたがinitialization blockを使用することができますまたのインスタンスを経由してmain方法から、このリストを取得することができますInvokeMethodクラス:

public class InvokeMethod { 
    ArrayList<String> exams = new ArrayList<String>(); 

    public InvokeMethod() { 
     exams.add("Java"); 
     exams.add("C#"); 
    } 

    public static void main(String[] args) { 
     InvokeMethod invokeMethod = new InvokeMethod(); 
     System.out.println(invokeMethod.exams.toString()); 
     invokeMethod.exams.add("Delphi"); 
     System.out.println(invokeMethod.exams.toString()); 
    } 
} 

を印刷します
[Java, C#] 
[Java, C#, Delphi] 
0

Java language specificationによると、クラス本体宣言にはインスタンス初期化子がありますが、メソッド呼び出しはありません。だからあなたの例ではArrayList<String> exams= new ArrayList<String>();

exams.add("Java");クラス本体の内部ではなく、JLSの抜粋許可されている:

ClassBody: 
    { ClassBodyDeclarationsopt } 

ClassBodyDeclarations: 
    ClassBodyDeclaration 
    ClassBodyDeclarations ClassBodyDeclaration 

ClassBodyDeclaration: 
    ClassMemberDeclaration 
    InstanceInitializer 
    StaticInitializer 
    ConstructorDeclaration 

ClassMemberDeclaration: 
    FieldDeclaration 
    MethodDeclaration 
    ClassDeclaration       
    InterfaceDeclaration 
    ;  
関連する問題