Compilação de Java está correta e ocorre erro na execução do programa, o que está errado?

Estou fazendo uns testes desenvolvendo pequenos programas em java. Um deles apresentou o seguinte fato: a compilação segue normalmente sem nenhum erro, gerando várias classes (um programa gera vários arquivos com extensão .class), e então, quando digito a linha mandando a execução do programa ocorre um erro dizendo que uma classe do programa tem que ter a função main, mas esta classe não deveria ter esta função pois main é de outra classe. É um programa para demonstrar herança, sobreposição de método e polimorfismo.
O programa se chama TwoDShape.java e gera os arquivos .class seguintes: 1) DynShapes.class, 2) Rectangle.class, 3) Triangle.class e 4) TwoDShape.class

A classe que apresenta o erro durante a tentativa de execução do código compilado é TwoDShape e o erro é o seguinte: Erro: o método main não foi encontrado na classe TwoDShape; defina o método main como: public static void main(String args[ ]) ou uma classe de aplicativo JavaFX deve expandir javafx.application.Application

Porque a máquina virtual java pede a inclusão de uma main onde não deve ter uma main? Abaixo tem a imagem da linha de comando que compila, da linha de comando que tenta executar o programa, e do erro que o comando produz. Veja:

Pensei que pudesse ser falta de algum parâmetro na compilação ou execução. As linhas da imagem da janela de execução acima estão corretas? Quem souber o que está errado, favor me mandar uma mensagem. Abaixo vou colocar a listagem do programa…

Obrigado,
anyblueangel3

// Usa o despacho dinâmico de métodos.
class TwoDShape {
    private double width;
    private double height;
    private String name;

    // Construtor padrão.
    TwoDShape() {
        width = height = 0.0;
        name = "none";
    }

    // Construtor parametrizado.
    TwoDShape(double w, double h, String n) {
        width = w;
        height = h;
        name = n;
    }

    // Constrói objeto com largura e altura iguais.
    TwoDShape(double x, String n) {
        width = height = x;
        name = n;
    }

    // Constrói objeto a partir de outro.
    TwoDShape(TwoDShape ob) {
        width = ob.width;
        height = ob.height;
        name = ob.name;
    }

    //Métodos acessadores para width e height.
    double getWidth() { return width; }
    double getHeight() { return height; }
    void setWidth(double w) { width = w; }
    void setHeight(double h) {height = h; }

    String getName() { return name; }

    void showDim() {
        System.out.println ("Width and Height are " + width + " and " + height);
    }

    double area() {
        System.out.println("area() mest be overridden");
        return 0.0;
    }

}
//Subclasse de TwoDShape para triângulos.
class Triangle extends TwoDShape {
    private String style;

    //Construtor padrão.
    Triangle() {
        super();
        style = "none";
    }

    //Construtor para Triangle.
    Triangle(String s, double w, double h) {
        super(w, h, "triangle");
        style = s;
    }

    // Construtor com um argumento.
    Triangle(double x) {
        super(x, "triangle"); // chama construtor da superclasse
        style = "filled";
    }

    //Constrói um objeto a partir de outro.
    Triangle(Triangle ob) {
        super(ob); // passa objeto para construtor de TwoDShape
        style = ob.style;
    }

    //Sobrepõe area() para Triangle.
    double area() {
        return getWidth() * getHeight() / 2;
    }

    void showStyle() {
        System.out.println("Triangle is " + style);
    }

}
// Subclasse de TwoDShape para retângulos.
class Rectangle extends TwoDShape {
    // Construtor padrão.
    Rectangle() {
        super();
    }

    // Construtor para Rectangle.
    Rectangle(double w, double h) {
        super (w, h, "rectangle"); // chama construtor da superclasse
    }

    // Constrói um quadrado.
    Rectangle (double x) {
        super(x, "rectangle"); // chama construtor da superclasse
    }

    // Constrói um objeto a partir de outro.
    Rectangle(Rectangle ob) {
        super(ob); // passa objeto para constructor de TwoDShape
    }

    boolean isSquare() {
        if(getWidth() == getHeight()) return true;
        return false;
    }

    // Sobrepõe area() para Rectangle.
    double area() {
        return getWidth() * getHeight();
    }

}
class DynShapes {
    public static void main(String args[]) {
        TwoDShape shapes[] = new TwoDShape[5];

        shapes[0] = new Triangle("outlined", 8.0, 12.0);
	shapes[1] = new Rectangle(10);
	shapes[2] = new Rectangle(10, 4);
	shapes[3] = new Triangle(7.0);
	shapes[4] = new TwoDShape(10, 20, "generic");

        for(int i = 0; i < shapes.length; i++) {
            System.out.println("Object is " + shapes[i].getName());
            System.out.println("Area is " + shapes[i].area());
            System.out.println();
        }

    }

}

Tente executar a classe DynShapes, que tem o método main:
java DynShapes

Deu certo. Eu estou começando agora e nunca tinha executado um programa com várias classes. Obrigadão.

1 curtida