首页 > 解决方案 > 在 Java 中编写 Rectangle 类的子类的问题

问题描述

我是一名从事 Java 项目的学生,我需要通过扩展默认的 Rectangle 类来练习使用继承;子类MyRectangle需要具有接受描述矩形边框和填充颜色及其尺寸的参数的构造函数。我还需要包含用于边框/颜色属性的 getter/setter 方法、将矩形旋转 180 度的方法,以及计算和返回矩形面积和周长的方法。所有必需的方法/字段都在此处的文档中进行了更详细的描述,file:///C:/Users/sweis/Downloads/MyRectangle.html 输出最终应如下所示:https ://i.stack.imgur.com/KP7LB.png

我已经编写了一些代码,但是我收到了很多错误消息,这些错误消息引用了我实际定义MyRectangle类和设置构造函数的程序部分,包括"Non-static variable cannot be referenced from a static context"and "error: cannot find symbol"。我在 Java 方面很新,所以我真的不确定,但我担心我从根本上误解了关于继承的一些东西,我正在努力自己解决这些错误。如果有人能看看我到目前为止所写的内容并帮助我理解我做错了什么,我将非常感激,这样我就可以更好地理解这个概念。以下是导致问题的部分:

import java.awt.Rectangle;
class Main {
  public static void main(String[] args) {
    MyRectangle mr1 = new MyRectangle(0, 0, 4, 2, "blue", "red", true);
    MyRectangle mr2 = new MyRectangle(5, 5, 10, 3, "green");
    MyRectangle mr3 = new MyRectangle();

    System.out.println(mr1 + " " + "area = " + mr1.area() + " perimeter = " + mr1.perimeter());
    System.out.println(mr2 + " " + "area = " + mr2.area() + " perimeter = " + mr2.perimeter());
    System.out.println(mr3 + " " + "area = " + mr3.area() + " perimeter = " + mr3.perimeter());
    System.out.println(mr4 + " " + "area = " + mr4.area() + " perimeter = " + mr4.perimeter());
  }

  public static class MyRectangle extends Rectangle {
    public static int width, height;
    public String color, borderColor;
    public boolean border;

    public MyRectangle() {
      super();
    }

    public MyRectangle(int x, int y, int w, int h, String c) {
      width = w;
      height = h;
      color = c;
    }

    public MyRectangle(int x, int y, int w, int h, String c, String bc, boolean b) {
      borderColor = bc;
      border = b;
    }
    

    public int area() {
      return (width * height);
    }

    public int perimeter() {
      return ((width * 2) + (height * 2));
    }

    public void setBorder(boolean newBorder) {
      border = newBorder;
    }

    }
  }
}

如果您有任何问题或需要我澄清任何事情,我一定会这样做。谢谢!

标签: javainheritancepolymorphism

解决方案


这个问题与这里的继承无关。

不能从静态上下文中引用非静态变量

由于 main 方法是静态的,它不能访问内部的非静态类MyRectangle。您已经在 MyRectangle 类定义中添加了 static 关键字,因此这应该可以解决此问题。你打电话也把课移到MyRectangle你的main课外。这将自动使其成为静态,因为所有“顶级类默认情况下都是静态的”。

这里还有另一个问题,width, height来自MyRectangle类的变量被定义为静态的。这将导致这些变量在您创建的所有不同 MyRectangle 对象之间共享并覆盖彼此的值。因此,从那里删除 static 关键字,因为它们对于每个实例都需要不同。

错误:找不到符号

对象 mr4 未创建但在打印语句中使用,这将导致找不到符号。因此,只需创建此对象即可解决您的问题。

在这些修复之后,您的代码应该类似于:

class Main {
  public static void main(String[] args) {
    MyRectangle mr1 = new MyRectangle(0, 0, 4, 2, "blue", "red", true);
    MyRectangle mr2 = new MyRectangle(5, 5, 10, 3, "green");
    MyRectangle mr3 = new MyRectangle();
    MyRectangle mr4 = new MyRectangle(); // now mr4 is created 

    System.out.println(mr1 + " " + "area = " + mr1.area() + " perimeter = " + mr1.perimeter());
    System.out.println(mr2 + " " + "area = " + mr2.area() + " perimeter = " + mr2.perimeter());
    System.out.println(mr3 + " " + "area = " + mr3.area() + " perimeter = " + mr3.perimeter());
    System.out.println(mr4 + " " + "area = " + mr4.area() + " perimeter = " + mr4.perimeter());
  }

  static class MyRectangle extends Rectangle {
    public int width, height; // this should be non static
    public String color, borderColor;
    public boolean border;

    public MyRectangle() {
      super();
    }

    public MyRectangle(int x, int y, int w, int h, String c) {
      width = w;
      height = h;
      color = c;
    }

    public MyRectangle(int x, int y, int w, int h, String c, String bc, boolean b) {
      this(x, y, w, h, c); // this should initialise other args by calling different constructor
      borderColor = bc;
      border = b;
    }


    public int area() {
      return (width * height);
    }

    public int perimeter() {
      return ((width * 2) + (height * 2));
    }

    public void setBorder(boolean newBorder) {
      border = newBorder;
    }
  }
}

推荐阅读