【问题标题】:Issues with writing a subclass of the Rectangle class in Java在 Java 中编写 Rectangle 类的子类的问题
【发布时间】:2021-06-06 23:31:25
【问题描述】:

我是一名在 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""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;
    }

    }
  }
}

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

【问题讨论】:

  • MyRectangle 对象mr4 未创建但在打印语句中使用,这将导致cannot find symbol
  • widthheight 也是 MyRectangle Objects 而不是 Class 的属性,因此您应该删除 static修饰符。另外,为什么您的构造函数中有int xint y?你没有在任何地方使用这些。否则,它看起来不像错误使用(非)static 导致的错误,至少在您提供的代码 sn-p 中。
  • 欢迎来到 StackOverflow!您的问题看起来像您提出了一些努力,在这里非常感谢。我仍然想指出以下几点:当您遇到错误时,包含整个错误消息是有意义的,包括行号和通常给出的代码行,以便其他人可以找到他们的位置更快地查看。 Note that it is discouraged to upload images of text here。相反,这应该以正确的格式简单地粘贴到问题中。

标签: java inheritance polymorphism


【解决方案1】:

这里的继承并不是真正的问题。

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

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

这里还有一个问题,来自MyRectangle 类的变量width, height 被定义为静态。这将导致这些变量在您创建的所有不同 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;
    }
  }
}

【讨论】:

    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多