使用 args 时,无法从静态引用非静态

Non-static Cannot Be Referenced From static,when using args

这是代码。 错误发生在第 2 行。

public class TestStack1 {

    public static void main(String[] args) {
        FixCapacityStackOfString fcstack = new FixCapacityStackOfString(100);
        for (int i = 0; i < args.length; i++) {
            fcstack.add(args[i]);
        }
    }


    class FixCapacityStackOfString {

        public FixCapacityStackOfString(int a) {
            list = new String[a];
        }

        private int size;
        private String[] list;


        public int size() {
            return size;
        }

        public boolean isEmpty() {
            if (size == 0) {
                return true;
            } else {
                return false;
            }
        }

        public String push() {
            return list[--size];
        }

        public void add(String s) {
            list[size++] = s;
        }
    }
}

因为它使用了args,所以我无法将main方法移动到public中的方法中class.How我可以更正吗?

您的代码如下所示:

class TestStack1 {
    public static void main(String[] args) { ... }
    class FixCapacityStackOfString { ... }
}

而你在 main 中使用了 FixCapacityStackOfString。但是 FixCapacityStackOfString 不是静态的 class:它需要 TestStack1 的一个实例。您在静态 main 方法中没有此实例。所以只需将 FixCapacityStackOfString 声明为静态的:

static class FixCapacityStackOfString { ... }

这是一个很好的问题,显示了 "static" 关键字的魔力。

您的程序可以通过三种方式执行:

First Way: When the class FixCapacityStackOfString is a nested class.

class ClassName
{
public static void main(String[] args) {

    ClassName obj = new ClassName();
    FixCapacityStackOfString fcstack =   obj.new FixCapacityStackOfString(100);
}

class FixCapacityStackOfString {

    public FixCapacityStackOfString(int a) {
        list = new String[a];
    }

    private int size;
    private String[] list;
    }

}

在此,构造函数(非静态方法)的调用需要定义它的 class 的实例。由于您是从静态方法 main 调用的,因此这就是您必须调用的方式。

Second Way: If you class FixCapacityStackOfString is outside the main class

class ClassName
    {
    public static void main(String[] args) {

        FixCapacityStackOfString fcstack =   new FixCapacityStackOfString(100);
    }


    }

class FixCapacityStackOfString {

        public FixCapacityStackOfString(int a) {
            list = new String[a];
        }

        private int size;
        private String[] list;
        }

Third Way: Declare the class FixCapacityStackOfString as static inside first class.

class ClassName
{
public static void main(String[] args) {

    FixCapacityStackOfString fcstack = new FixCapacityStackOfString(100);
}

static class FixCapacityStackOfString {

    public FixCapacityStackOfString(int a) {
        list = new String[a];
    }

    private int size;
    private String[] list;
    }

}