Метод 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
(как предложено Эллиоттом) или сделайте свой класс ShapeTest
static
например,
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){
}
}