练习 Java 题

Practice Java problems

我正在做这个大学练习,我都被卡住了,我应该制作一个程序来画圆和线。它有 3 个包,Evaluar(with the main class), Dibujo(with the drawing class) and Forma (with 4 class, The FATHER , forma, formabasica which heritage form Forma and Circulo&Linea 继承自 formaBasica,这里是主要的 class.

    package PaqueteAplicacion;

import PaqueteFormas.Forma;
import java.util.Scanner;
import PaqueteFormas.Circulo;
import PaqueteFormas.Linea;


public abstract class Evaluar {


    public static void main (String[] args) {
        //Creamos atributos para lo que graficaremos  
        Forma linea1;
        Forma linea2;

         linea1 =  new Linea(); //PROBLEM HERE
         linea2 =  new Linea(1,1);//PROBLEM HERE


        }

Eclipse 的错误 "Cannot instantiate the type Linea",我不知道为什么会给我这个问题。

这是我的 Linea class,我和 Circulo 有同样的问题。

package PaqueteFormas;
import java.util.Scanner;
import PaqueteGraficos.Dibujo;

public  class Linea extends FormaBasica {

    //Atributos

        int numSegmentos;


        public Linea(){

        }

        public Linea(int ejeX, int ejeY){
            super(ejeX,ejeY);
        }




        public void cambiarTamano(int incrementoSegmentos){

            numSegmentos = incrementoSegmentos;

        }

        public void paintComponent() {
        Dibujo.dibujarLinea(ejeX, ejeY, numSegmentos);//More Problem ejeX cannot be resolved as a variable

        }
}

如果您需要更多信息,请告诉我,谢谢!

抱歉,我是 Whosebug 的新手,所以如果我的 post 不正确,请告诉我。

我添加了项目的 class' java 的其余部分: 这是父亲:Forma 的 class:

    package PaqueteFormas;




public abstract class Forma {

    //Añadimos atributos

    private int x,y;


    public Forma() 
    {
        this.x = 1;
        this.y = 1;
    }


    public Forma( int ejeX, int ejeY) {
        this.x = ejeX;
        this.y = ejeY;
    }

    //Establece la edición atributo

    public void setX(int ejeX) {
        x = ejeX;
    }
    public void setY(int ejeY) {
        y = ejeY;

    }


    public int getX() {
        return x;
    };

    public int getY() {
        return y;
    };


    public void moverEjeX(int variacionEnX) {
        x += variacionEnX;

    }
    public void moverEjeY(int variacionEnY) {
        y += variacionEnY;
    }

    public abstract void paintComponent();

    public abstract void cambiarTamano (int variacionTamano);
}

来自 Forma 的遗产 class:

    package PaqueteFormas;

    public abstract class FormaBasica extends Forma {

    public FormaBasica(){//Constructor por defecto
        super(1,1);
    }

    public FormaBasica(int ejeX, int ejeY){//Constructor pasando los atributos
        super(ejeX,ejeY);
    }
}

来自 FormaBasica 的其他 class' 遗产

 package PaqueteFormas;
    import java.util.Scanner;
    import PaqueteGraficos.Dibujo;

public  class Linea extends FormaBasica {



        int numSegmentos;


        public Linea(){

        }

        public Linea(int ejeX, int ejeY){
            super(ejeX,ejeY);
        }




        public void cambiarTamano(int incrementoSegmentos){

            numSegmentos = incrementoSegmentos;

        }

        public void paintComponent() {
        Dibujo.dibujarLinea(ejeX, ejeY, numSegmentos);
        }
}

你的问题的根源在于 Linea 中的这一行:

        Dibujo.dibujarLinea(ejeX, ejeY, numSegmentos);//More Problem ejeX cannot be resolved as a variable

错误消息是有道理的:paintComponent 方法中没有变量 ejeX,这一行所在的位置,也没有字段(实例或 class 变量)ejeXLinea class 中。其中一个构造函数中有一个参数 ejeX 。但是这里的构造函数就像一个方法,你不能访问另一个方法中的参数或变量,因为这样做没有意义。方法在不同的时间被调用,所以当另一个方法被调用并执行时,一个方法的变量通常不存在。当然,ejeY 也一样。

我假设您打算使用创建对象时传递给 Linea 构造函数的 ejeXejeY 的值。这些已经存储在Forma superclass中,你可以通过那个class的getXgetY方法来获取它们。所以解决方法是将行更改为:

        Dibujo.dibujarLinea(getX(), getY(), numSegmentos);

对于您的其他问题:上述错误阻止了 Linea class 的编译。当它不能被编译时,它也不能被实例化。所以我希望现在也能解决这个问题。

如果在清除旧错误时出现新的错误消息,请不要失望,这是正常的。

而且不是不友好,恰恰相反:看看你能不能找到愿意帮助你的当地人。也许是同学或助教? Stack Overflow 上的周转时间太长,所以只要你依赖我们,你的进步就会很慢。当您 post 编写这么多代码时更是如此,因为许多用户会放弃阅读所有代码。