【问题标题】:The method main cannot be declared static; static methods can only be declared in a static or top level type方法 main 不能声明为静态的;静态方法只能在静态或顶级类型中声明
【发布时间】:2014-11-09 01:16:47
【问题描述】:

在我的编码中,父类Shape 是一个抽象对象,它有几个子类。我的编码如下:

import java.util.Random;

abstract class Shape {
    protected Color color;
    protected Point point;

    public Shape(Color color, Point point) {
        this.color = color;
        this.point = point;
    }
    public abstract String Type();
}

class Rectangle extends Shape {
    public Rectangle(Color color, Point point) {
        super(color, point);
    }

    public String Type() {
        return "Rectangle";
    }
    class Triangle extends Shape {
        public Triangle(Color color, Point point) {
            super(color, point);
        }
        public String Type() {
            return "Triangle";
        }
    }
    class Eclipse extends Shape {
        public Eclipse(Color color, Point point) {
            super(color, point);
        }
        public String Type() {
            return "Eclipse";
        }
    }
    public class ShapeTest {
        public static void main(String[] args) {
            Color color = new Color(50, 100, 150);
            Point point = new Point(50, 50);
            Shape[] theShape = {
                new Rectangle(color, point),
                    new Triangle(color, point),
                    new Eclipse(color, point)
            };
            Shape shapechoice;
            Random select = new Random();
            for (int i = 0; i < 10; i++) {
                shapechoice = theShape[select.nextInt(theShape.length)];
                System.out.println("The " + (i + 1) + "type you chose is: " + shapechoice.Type());;
            }
        }
    }

Eclipse 在public static void main(String[] args){ 处说“方法 main 不能声明为静态;静态方法只能以静态或顶级类型声明”,但我认为这种语法应该是一种固定的常用格式?为什么在这里我需要删除“静态”?抱歉,我是 java 新手,可能对此感到模糊。

【问题讨论】:

  • 将你的 main 移到外部类或重新调整你的代码。
  • 你不能在内部类中拥有 main 方法。将其移至外部类。

标签: java static


【解决方案1】:

从内部类ShapeTest 中移动您的main() 方法。你不能把它放在一个非静态的非顶级类中。在您现有的代码中,您可以将main() 放入Rectangle,或者您可以将ShapeTest 移动为顶级类。

【讨论】:

    【解决方案2】:

    你有一个像这样的class 声明:

    class Rectangle extends Shape {
    
    }
    

    这是一个顶级类。

    接下来你有一个内部类声明:

    class Rectangle extends Shape {
        public class ShapeTest {
        }
    }
    

    这是一个内部类,因为它不是static。它位于Rectangle 的实例上下文中,并且隐式引用了Rectangle.this

    接下来你有一个静态方法声明:

    class Rectangle extends Shape {
        public class ShapeTest {
            public static void main(String[] args){
            }
        }
    }
    

    static 声明位于ShapeTest 的实例声明中。这是不允许的。

    所以要么将ShapeTest 声明为静态嵌套类(在静态嵌套类中包含main,这很奇怪且令人困惑):

    class Rectangle extends Shape {
        public static class ShapeTest {
            public static void main(String[] args){
            }
        }
    }
    

    或者在自己的ShapeTest.java 文件中将ShapeTest 声明为顶级类(更好):

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

    【讨论】:

      【解决方案3】:

      您必须将您的 main() 方法移动到顶级类或静态类。将main() 方法移至Rectangle 类(如Elliott 所建议)或将您的类设为ShapeTest static,例如

      public class Rectangle {
          public static class ShapeTest {
              public static void main(String[] args) {
              }
          }
      }
      

      然后你就可以用java Rectangle.ShapeTest调用类了。

      【讨论】:

        【解决方案4】:

        您需要将静态 main 方法放在 (A) 顶级或 (B) 静态类中。您已将 main 方法放在常规嵌套类中,该类依赖于定义它的类的实例。

        尝试将关键字static 添加到TriangleEclipseShapeTest 的定义中,如下所示: public static class ShapeTest.

        顺便说一句:创建多个文件会更好。 顺便说一句 2:为什么 TriangleEclipseShapeTest 是 Rectangle 的内部类?

        【讨论】:

          猜你喜欢
          • 2014-05-12
          • 1970-01-01
          • 1970-01-01
          • 2011-03-23
          • 1970-01-01
          • 2016-12-14
          • 1970-01-01
          • 1970-01-01
          • 2013-08-01
          相关资源
          最近更新 更多