Java 中的 .getWidth()、.getHeight()

.getWidth(), .getHeight() in Java

所以我昨天才开始学习 Java 来自另一种语言,我正在通读我的教科书,发现它到目前为止非常好。但是我做了一个练习,基本上要求我使用 Rectangle 创建一个新对象并找到该区域。下面是我想出的工作代码。

现在来自其他编程语言,我只是在玩弄这个并做了 int area,width,height; 然后它给了我一个错误,说我必须使用 double 才能利用 .getWidth();, .getHeight()。我在我的书中找不到任何东西告诉我为什么我必须把它变成双倍,我开始在网上寻找并找到这个 link

现在我在网上找到了一些文档,其中告诉我也可以使用 double,但我不太确定为什么需要将它们设置为 double。是因为制作Java的人知道我们在处理坐标和计算宽度、高度和坐标时需要精度吗?我的书说制作 double 变量比 int 需要更多内存(我来自做很多 javascript 和 PHP,所以阅读 floatdouble 确实对我有好处)。

即为什么我需要使我的 area,height,width 变量加倍才能使用 .getWidth,.getHeight

package keepo;
import java.awt.Rectangle;
public class tuna{
    public static void main(String [] args){
        Rectangle rect = new Rectangle(10,20,50,40);
        double area,width,height;
        width = rect.getWidth();
        height = rect.getHeight();
        area = width * height;
        System.out.println("Width is : " + width + "Height is : " + height);
        System.out.println("Area is : " + area);
    }
}

这是因为 java api 中这些方法是这样定义的。正如您在 修饰符和类型 列下看到的那样,方法 getWidth()getHeight() 所有 return 类型 double 的值。

Imran Ali是对的。

这是 java getHeight()getWidth() 的文档。

java.​awt.​Rectangle

  • public double getHeight()

Returns the height of the bounding Rectangle in double precision


Returns: the height of the bounding Rectangle.

但是如果你 want/need 使用 int 而不是 double,对 height 使用以下代码,并对 width 也重复这些代码:

  • 使用 getSize() 方法 returns 矩形 dimension 然后使用它的字段(widthheight
    • int height = rect.getSize().height;
  • 使用数据type casting
    • int height = (int) rect.getHeight();
    • int height = (int) rect.getSize().getHeight();

因为在这种情况下,你不应该使用那些方法。 AWTclassRectangledoes store coordinates as ints。如果您想这样做,您可以轻松地将它们读回 ints,方法是访问 字段 而不是调用 getter 方法:

int area, width, height;
width = rect.width; // not getWidth()
height = rect.height; // not getHeight()
area = width * height;

getWidth()getHeight() 方法在这里的目的为零,因为它们总是 return 与字段相同的值,除了不同的类型(并且您已经可以分配任何 int 值到 double 无论如何,当 double 是你想要使用的值时)。

那么为什么这两种方法(以及 getX()getY())存在呢?因为在 Java 1.2 中扩展了 API 中的几何内容。人们希望能够使用浮点坐标,而 Rectangle 做不到。 Java 维护者无法将 Rectangle 的字段从 int 更改为 double,因为这会破坏与旧代码已经使用它的方式的向后兼容性。所以添加了两个新的classes,Rectangle2D.Float and Rectangle2D.Double,它们分别将坐标存储为floats和doubles。

但是,如果您想对任何矩形进行通用处理,而不需要为所有矩形类型编写单独的代码,该怎么办?还添加了一个新的摘要class、Rectangle2D,作为三个矩形classes 的超class。这个 class 是抽象的(这意味着它不能自己创建,因为它是不完整的)并且它本身不存储任何坐标。但是,它确实指定了其子 class 遵循的契约(这意味着任何 Rectangle2D 方法在其所有三个实现中都可用)。这包括 return doublegetWidth()getHeight() 方法,无论特定矩形的实际存储类型如何。

将抽象提升到一个额外的,也许是多余的层次,他们还添加了 RectangularShape 作为几个具有矩形边界的形状的超级 class:Rectangle2DRoundRectangle2D , Ellipse2DArc2D。即class实际上声明了getWidth()getHeight()方法,所有RectangularShape子classes必须提供:

// 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());

因此您可以在任何矩形(或 "rectangular shape")上调用那些 getter 方法来获取其坐标,但是如果您知道您有特定的形状 class,您 can/should 直接访问它的字段,因为这样更简单,而且它会在不将它们转换为不同类型的情况下为您提供值。

P.S。与Point类似,它使用int坐标,但提供double getX()double getY()方法,因为后来添加了classes Point2D.Float, 和Point2D.Double, 以及抽象超class Point2D.

P.P.S。对于矩形区域使用 double(或 long)实际上有一个小优势,即使您的矩形坐标是 ints。大乘法可能 溢出 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

Rectangle.getWidth()Rectangle.getHeight() 方法都 return 它们的值具有 double 精度,如其他人所述。如果你继续使用它们会更容易,为了防止 Rectangle 的值被意外更改,只需将值转换为 int:

int width = (int)rect.getWidth()int height = (int)rect.getHeight()