所以我昨天刚开始用不同的语言学习Java,我正在阅读我的教科书并发现它到目前为止还不错。但是我做了一个练习,基本上要求我创建一个新的Object use Rectangle并找到该区域。以下是我提出的工作代码。
现在来自其他编程语言,我只是在玩这个并做int area,width,height;
然后它给了我一个错误,说我必须使用double才能使用.getWidth();, .getHeight()
。我在书中找不到任何东西告诉我为什么我要把它变成双重的并且我开始在网上找到这个链接
现在我在网上发现了一些文件,它告诉我也要使用双,但我不确定为什么我需要将它们设置为双打。是因为制作Java的人知道当我们使用坐标并使用宽度,高度和坐标进行数学运算时需要精度吗?我的书说,制作double
变量而不是int
需要更多的内存(我来自大量的javascript和PHP,所以阅读float
和{{1这对我有好处)。
即。为什么我需要将double
变量加倍才能使用area,height,width
.getWidth,.getHeight
答案 0 :(得分:1)
这是因为这就是java api中定义这些方法的方法。正如您在修饰符和列下看到的那样,方法getWidth()
,getHeight()
都返回double
类型的值。
答案 1 :(得分:1)
因为在这种情况下,您不应该使用这些方法。 AWT课程Rectangle
does store coordinates as int
s。如果您想要做的话,可以通过访问字段而不是调用getter方法轻松地将它们读回int
:
int area, width, height;
width = rect.width; // not getWidth()
height = rect.height; // not getHeight()
area = width * height;
getWidth()
和getHeight()
方法在此处没有用处,因为它们将始终返回与字段相同的值,但不同的类型除外(并且您已经可以指定任何int
当double
是你想要使用的时候,价值为double
。
那么为什么这两种方法(以及getX()
和getY()
)都存在呢?因为在Java 1.2中,API中的几何内容被扩展了。人们希望能够使用Rectangle
无法做到的浮点坐标。并且Java维护者无法将Rectangle
的字段从int
更改为double
,因为这会破坏旧代码已经使用它的方式的向后兼容性。因此添加了两个新类Rectangle2D.Float
和Rectangle2D.Double
,它们分别将坐标存储为float
和double
。
但是,如果您想要对任何矩形一般工作,而不为所有矩形风格编写单独的代码,该怎么办?还添加了一个新的抽象类Rectangle2D
,作为三个矩形类的超类。这个类是抽象的(意思是它不能自己创建,因为它是不完整的)并且它本身不存储任何坐标。但是,它指定了其子类遵循的契约(意味着任何Rectangle2D
方法在其所有三个实现中都可用)。这包括返回getWidth()
s的getHeight()
和double
方法,无论特定矩形的实际存储类型如何。
将抽象视为一个额外的,也许是多余的,他们还将RectangularShape
添加为具有矩形边界的多个形状的超类:Rectangle2D
,RoundRectangle2D
,Ellipse2D
和Arc2D
。这是实际声明getWidth()
和getHeight()
方法的类,所有RectangularShape
子类必须提供这些方法:
// What's this shape? A rectangle? An ellipse? Does it use ints? floats? doubles?
RectangularShape something = ......;
// We don't care!
System.out.println("The shape (whatever it is) occupies an area of:");
System.out.println(something.getWidth() + " × " + something.getHeight());
所以你可以在任何矩形(或#34;矩形")上调用这些getter方法来获取它的坐标,但是如果你知道你有一个特定的形状类,你可以/应该直接访问它的字段,因为它更简单,它为您提供值而不将它们转换为其他类型。
P.S。与Point
类似的故事使用int
坐标,但提供double getX()
和double getY()
方法,因为后来添加的类Point2D.Float
,以及Point2D.Double
和抽象超类Point2D
。
P.P.S。即使您的矩形坐标为double
s,对于矩形区域使用long
(或int
)实际上也有一个小优势。大乘法可能溢出 int
的32位范围,产生错误的结果。如果将至少一个值转换为更大的类型,则会导致乘法以更大的类型完成,然后您可以安全地存储而不会溢出:
Rectangle big = new Rectangle(0, 0, 1000000, 1000000);
int area = big.width * big.height;
long bigArea = (long)big.width * big.height;
System.out.println(area); // -727379968 (uh oh!)
System.out.println(bigArea); // 1000000000000
答案 2 :(得分:0)
Imran Ali是对的。
这是getHeight()
和getWidth()
的java文档,它们是相同的。
java.awt.Rectangle
public double getHeight()
以双精度
返回<= strong>中的边界矩形的高度 边界矩形的高度。
但是如果你想/需要使用 int 而不是 double ,请使用以下代码 height 和重复宽度:
getSize()
方法返回矩形dimension,然后使用它的字段(width
和height
)
int height = rect.getSize().height;
int height = (int) rect.getHeight();
int height = (int) rect.getSize().getHeight();
答案 3 :(得分:0)
Rectangle.getWidth()
和Rectangle.getHeight()
方法都以double
精度返回其值,如其他人所述。如果您只是继续使用它们会更容易,为了防止Rectangle
的值在意外情况下被更改,只需将值转换为int
:
int width = (int)rect.getWidth()
和int height = (int)rect.getHeight()