-1

private static void main(...)my から、コンストラクターで初期化された配列スタックを持つクラスに値を渡そうとしています。内の変数に割り当てた値main()と、pushその値をこの innerClass 内の配列スタックに取り込む方法を考えていました。

配列スタックが機能することはわかっています。以前にこのクラスを問題なく実装しましたが、arrayStack()作成したmain(). 3 番目のクラスの追加は、私を混乱させます。

コードに深く入り込むことなくmain()、別のクラス (同じパッケージ) のメソッドからの引数を使用して、コンストラクターで初期化されたスタックに引数を渡す方法を誰かが説明 (またはいくつかのリソースを参照) できることを願っていました)?

値を取得しようとしている場所の例:

package program2;
public class Exec {
public Exec(DStack ds) {
    /*I have initilized an arrayStack to hold doubles (i.e. DStack). 
     * I can use ds.push()/pop()/top() etc. 
     * I cannot take the value from Calculator.java and push that value
     * here, which is what I need help understanding?
     * */
     ds.push(Calculator.i); //I would expect an error here, or the value stored in 
                           //Calculator.i to be added to the stack. Instead program
                           //terminates. 
   }
}

どこから値を取得したいですか:

package program2;
public class Calculator {
public static double i;
public static void main(String[] args) {
    i=9; //I'm expecting that by using Calculator.i in the Exec class that
        //I should be able to push 'i' onto the stack. 
   }
}

この質問は、昨日ここで作業することができた質問と回答に沿っています: Get answer from user input and pass to another class . 違いは 3 つあります。1 つは、メニューから回答を選択してアクションを実行する必要がなくなったことです。String2 つ目は、スタック上のアイテムを取得する方法と、一連の if/else ステートメントを比較する方法を知りたいです。最後に、このアクションの基本についてもう少し詳しく知りたいと思います。

4

3 に答える 3

2

アプリケーションの仕組みを完全に誤解しているようです。プログラムを起動すると、java は main メソッドを実行します。メソッドの最後に到達するまで、すべての命令が順番に実行されます。このメソッドから他のスレッドを開始していない場合、メイン メソッドの最後の命令が実行されると、プログラムは終了します。

この場合、メイン メソッドには 1 つの命令のみが含まれます。

i = 9;

したがって、この命令が実行され、最後の命令であるため、プログラムは終了します。Exec クラスをどこからも参照していないため、このクラスは JVM によってロードされることさえありません。

Exec クラスを使用する場合は、プログラムのどこかに is を使用する必要があります。たとえば、次のことができます

i = 9;
DStack dstack  = new DStack();
Exec exec = new Exec(dstack);

他のオブジェクトがこの値を取得できるようにするためにパブリック静的変数に何かを格納することは、パラメーターの受け渡しの非常に貧弱な形式であることに注意してください。Exec オブジェクトが機能するために値が必要な場合、それはそのコンストラクターの引数である必要があります。

public Exec(DStack ds, double value) {
    ds.push(value);
}

メイン メソッドでは、public static 変数ではなく、ローカル変数を使用します。

double i = 9;
DStack dstack  = new DStack();
Exec exec = new Exec(dstack, i);
于 2013-03-23T14:32:34.013 に答える
1

あなたの質問を正しく理解できたら、Execクラスのインスタンスを作成する必要があります。プログラム内でのインスタンスを作成し、値をスタックにプッシュした後DStackにコンストラクターに渡すこともできます。Execdouble

package program2;
public class Calculator {
public static double i;
public static void main(String[] args) {
    DStack dStack = new DStack();
    dStrack.push(i);
    Exec exec = new Exec(dStack);
   }
}
于 2013-03-23T14:31:39.920 に答える
1

クラスとインスタンスの概念を混同していると思います。クラスに値を渡すのではなく、値をインスタンスに渡します (staticフィールドが呼び出されることがありclass variables、混乱を招くことがありますが、今は無視してください)。

簡単に言えば、クラスはあなたが書いたそのクラスのコードです。インスタンスは、そのクラスの定義から生成された実際のものであり、実際に何かを行います。したがって、一番の秘訣は、クラスを「インスタンス化」してインスタンスを作成することです。次に、以下のように渡したい値を渡します。

class Foo {
    public static main(String[] args) {
        Bar bar = new Bar(); // <-- now you have an instance called bar
        bar.arrayStack.push(args[0]); // <-- Now it's passed!
    }

    class Bar {
        ArrayStack arrayStack;
        Bar(){
            arrayStack = new ArrayStack();
        }  
}
于 2013-03-23T14:33:32.073 に答える