-1

我正在尝试将值从 my 传递private static void main(...)到一个在构造函数中初始化了数组堆栈的类。我想知道如何将我分配给变量的值main()push该值放到这个内部类中的数组堆栈上?

我知道数组堆栈有效,我之前已经实现过这个类没有问题,但我只使用arrayStack()我创建的和一个main(). 第三课的加入让我很困惑。

在没有深入了解我的代码的情况下,我希望有人可以向我解释(或指向我一些资源)如何将参数传递给在构造函数中初始化的堆栈,参数来自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。有三个区别,一是我不再从菜单中选择答案并执行操作。第二,我想知道如何在堆栈上获取项目,而不是String在一系列 if/else 语句中进行比较。最后,我想更详细地了解一下这个动作的具体细节。

4

3 回答 3

2

您似乎完全误解了应用程序的工作原理。当您启动程序时,java 会执行您的 main 方法。它的所有指令都按顺序执行,直到方法结束。如果您还没有从此方法启动任何其他线程,则当 main 方法中的最后一条指令已执行时,程序将终止。

在这种情况下,main 方法只包含一条指令:

i = 9;

所以这条指令被执行,因为它是最后一条,程序终止。你甚至没有在任何地方引用 Exec 类,所以这个类甚至没有被 JVM 加载。

如果你想使用 Exec 类,那么你必须在程序的某个地方做一些事情。例如,你可以做

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

请注意,将某些内容存储在公共静态变量中以便其他对象能够获取此值是一种非常糟糕的参数传递形式。如果 Exec 对象需要一个值才能工作,那么它应该是其构造函数的参数:

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

在 main 方法中,您将使用局部变量而不是公共静态变量:

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

如果我正确理解你的问题,你应该创建一个Exec类的实例。您还可以在程序中创建一个实例,并在将值压入堆栈后将DStack其传递给Exec构造函数。double

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 回答