繁体   English   中英

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

[英].getWidth(), .getHeight() in Java

所以我昨天刚开始学习Java来自不同的语言,我正在阅读我的教科书,并发现它到目前为止还不错。 但是我做了一个练习,基本上要求我创建一个新的Object use Rectangle并找到该区域。 以下是我提出的工作代码。

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

现在我在网上找到了一些文档,它告诉我也要使用double,但我不确定为什么我需要将它们设置为双精度。 是因为制作Java的人知道当我们使用坐标并使用宽度,高度和坐标进行数学运算时需要精度吗? 我的书说,制作一个double变量而不是一个int需要更多的内存(我来自于大量的javascript和PHP,所以读一下floatdouble float对我来说是好事)。

IE为什么我需要让我的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中定义这些方法的方法。 正如您在modifier和type列下看到的那样,方法getWidth()getHeight()都返回double类型的值。

因为在这种情况下,您不应该使用这些方法。 AWT类Rectangle 将坐标存储为int 如果这是你想做的事情,你可以通过访问字段而不是调用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.FloatRectangle2D.Double ,它们分别将坐标存储为float s和double s。

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

将抽象作为一个额外的,也许是多余的级别,他们还将RectangularShape添加为具有矩形边界的多个形状的超类: Rectangle2DRoundRectangle2DEllipse2DArc2D 这是实际声明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());

所以你可以在任何矩形(或“矩形”)上调用这些getter方法来获取它的坐标,但如果你知道你有一个特定的形状类,你可以/应该直接访问它的字段,因为它更简单,它给出了你没有将它们转换为不同类型的值。

PS这是一个与Point类似的故事,它使用int坐标,但提供了double getX()double getY()方法,因为后来添加了类Point2D.FloatPoint2D.Double和抽象超类Point2D

PPS对于矩形区域使用double (或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

伊姆兰阿里是对的。

这是getHeight()getWidth()的java文档,它们是相同的。

java.​awt.​Rectangle

  • public double getHeight()

double精度返回边界Rectangle的高度


返回:边界Rectangle的高度。

但是如果你想/需要使用int 而不是 double ,请使用以下代码来表示高度 ,并将它们重复为宽度

  • 使用返回矩形尺寸的 getSize()方法然后使用它的字段( widthheight
    • int height = rect.getSize().height;
  • 使用数据类型转换
    • int height = (int) rect.getHeight();
    • int height = (int) rect.getSize().getHeight();

Rectangle.getWidth()Rectangle.getHeight()方法都以double精度返回其值,如其他人所述。 如果你只是继续使用它们会更容易,为了防止Rectangle的值在意外发生变化,只需将值转换为int

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM