java - 在 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;
}
}
}
}
如果您有任何问题或需要我澄清任何事情,我一定会这样做。谢谢!
解决方案
这个问题与这里的继承无关。
不能从静态上下文中引用非静态变量
由于 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;
}
}
}
推荐阅读
- python - Jupyter Notebook 甚至无法正常工作
- reactjs - 在反应原生博览会中从后台加载应用程序时如何加载闪屏
- swift - LLDB for Swift:泛型类型的自定义类型摘要
- sql - 在 SQL 中将日期 INT 转换为日期
- java - JavaFx:VBox 在不可见时仍然占用空间
- hdfs - CDH6.3 安装 hdfs 失败
- python - 使用 PIL 从黑白 .mat 文件加载的图像与预期不符
- mysql - 如何在 MySQL 中将表作为变量输入
- javascript - 如何用同一对象的属性替换占位符位置?
- php - PHPSTAN:捕获异常而不抛出它