Метод main не может быть объявлен статическим; статические методы могут быть объявлены только в статическом типе или типе верхнего уровня

В моем коде родительский класс 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 говорит: "Метод main не может быть объявлен статическим; статические методы могут быть объявлены только в статическом типе или типе верхнего уровня" в public static void main(String[] args){, но я думал, что этот синтаксис должен быть широко используемым форматом, который вроде исправлен? Почему здесь мне нужно удалить "статический"? Извините, я новичок в java, и, возможно, это не совсем понятно.

4 ответа

Решение

Переместить ваш main() метод из внутреннего класса ShapeTest, Вы не можете поместить его в нестатический класс не верхнего уровня. В вашем существующем коде вы могли бы поставить main() в Rectangleили вы могли бы двигаться ShapeTest быть классом высшего уровня.

Вы должны переместить main() метод класса верхнего уровня или статического класса. Либо переместите main() метод к классу Rectangle (как предложено Эллиоттом) или сделайте свой класс ShapeTeststaticнапример,

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

Тогда вы можете позвонить в класс с java Rectangle.ShapeTest,

Вам нужно поставить статический main метод в (A) статическом классе верхнего уровня или (B). Вы положили main метод в обычном вложенном классе, который зависит от экземпляра класса, в котором он определен.

Попробуйте добавить ключевое слово static к определениям Triangle, Eclipse а также ShapeTest, вот так:public static class ShapeTest,

Кстати 1: вам будет лучше создать несколько файлов. Кстати 2: почему Triangle, Eclipse а также ShapeTest внутренние классы Rectangle?

У тебя есть 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){
    }
}
Другие вопросы по тегам