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

时间:2019-02-23 05:46:36

标签: java static-methods

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

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方法移到公共类的方法中。如何纠正它?

2 个答案:

答案 0 :(得分:0)

您的代码如下:

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

然后您在FixCapacityStackOfString中使用main。但是FixCapacityStackOfString不是静态类:它需要一个TestStack1的实例。您在静态main方法中没有此实例。因此,只需将FixCapacityStackOfString声明为静态:

static class FixCapacityStackOfString { ... }

答案 1 :(得分:0)

这是一个很好的问题,它显示了“静态”关键字的神奇之处。

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

  

第一种方法:当FixCapacityStackOfString类是嵌套类时。

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

}

在这种情况下,调用非静态方法的构造函数需要在其中定义它的类的实例。由于您是从静态方法main调用的,因此必须调用它。

  

第二种方式:如果您将FixCapacityStackOfString类放在主类之外

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

第三种方式:在第一个类中将FixCapacityStackOfString类声明为静态。

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

}