【问题标题】:Non-static Cannot Be Referenced From static,when using args [closed]使用 args 时,不能从静态引用非静态 [关闭]
【发布时间】:2019-02-23 05:46:35
【问题描述】:

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

【问题讨论】:

  • 什么错误?第三行是什么? args 有什么用?
  • 请提供更多代码以及错误
  • main 方法是您的应用程序启动时的入口点,而不是您可以调用或以其他方式包含在您自己的类中的某个方法(如果您正在尝试这样做)。
  • 你应该学习对象、类和方法。您尚未发布完整代码,但我怀疑 FixCapacityStackOfString 是一个嵌套类。由于这个嵌套类不是static,你需要一个封闭类的实例。

标签: java static-methods


【解决方案1】:

这是一个很好的问题,展示了“静态”关键字的魔力。

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

第一种方式:当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;
    }

}

【讨论】:

    【解决方案2】:

    您的代码如下所示:

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

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

    static class FixCapacityStackOfString { ... }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-06
      • 2019-03-17
      • 2011-11-30
      • 1970-01-01
      相关资源
      最近更新 更多