当使用args [关闭]时,无法从静态引用非静态

问题描述 投票:-3回答:2

这是代码。错误发生在第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方法移动到公共类中的方法中。我怎么能纠正它?

java static-methods
2个回答
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;
    }

}

0
投票

您的代码如下所示:

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

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

static class FixCapacityStackOfString { ... }
© www.soinside.com 2019 - 2024. All rights reserved.