方法main不能声明为static;静态方法只能在静态或顶级类型中声明

时间:2014-09-15 13:32:07

标签: java static

在我的编码中,父类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说&#34;方法main不能声明为static;静态方法只能在静态或顶级类型中声明&#34;在public static void main(String[] args){,但我认为这种语法应该是一种常用的格式,有点固定吗?为什么在这里我需要删除&#34;静态&#34;?对不起,我是java的新手,可能会因此而模糊不清。

4 个答案:

答案 0 :(得分:2)

从内部类main()移动ShapeTest方法。您无法将其置于非静态非顶级课程中。在现有代码中,您可以将main()放入Rectangle,也可以将ShapeTest移至顶级类。

答案 1 :(得分:0)

你有一个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文件中声明ShapeTest.java作为顶级课程(更好):

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

答案 2 :(得分:0)

您必须将main()方法移至顶级类或静态类。将main()方法移至课程Rectangle(按照Elliott的建议)或将您的课程ShapeTest static移至,例如。

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

然后,您可以使用java Rectangle.ShapeTest调用该课程。

答案 3 :(得分:0)

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

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

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