Java 中的 .getWidth()、.getHeight()
.getWidth(), .getHeight() in Java
所以我昨天才开始学习 Java 来自另一种语言,我正在通读我的教科书,发现它到目前为止非常好。但是我做了一个练习,基本上要求我使用 Rectangle 创建一个新对象并找到该区域。下面是我想出的工作代码。
现在来自其他编程语言,我只是在玩弄这个并做了 int area,width,height;
然后它给了我一个错误,说我必须使用 double 才能利用 .getWidth();, .getHeight()
。我在我的书中找不到任何东西告诉我为什么我必须把它变成双倍,我开始在网上寻找并找到这个 link
现在我在网上找到了一些文档,其中告诉我也可以使用 double,但我不太确定为什么需要将它们设置为 double。是因为制作Java的人知道我们在处理坐标和计算宽度、高度和坐标时需要精度吗?我的书说制作 double
变量比 int
需要更多内存(我来自做很多 javascript 和 PHP,所以阅读 float
和 double
确实对我有好处)。
即为什么我需要使我的 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 然后使用它的字段(width
和 height
)
int height = rect.getSize().height;
- 使用数据type casting
int height = (int) rect.getHeight();
int height = (int) rect.getSize().getHeight();
因为在这种情况下,你不应该使用那些方法。 AWTclassRectangle
does store coordinates as int
s。如果您想这样做,您可以轻松地将它们读回 int
s,方法是访问 字段 而不是调用 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
,它们分别将坐标存储为float
s和double
s。
但是,如果您想对任何矩形进行通用处理,而不需要为所有矩形类型编写单独的代码,该怎么办?还添加了一个新的摘要class、Rectangle2D
,作为三个矩形classes 的超class。这个 class 是抽象的(这意味着它不能自己创建,因为它是不完整的)并且它本身不存储任何坐标。但是,它确实指定了其子 class 遵循的契约(这意味着任何 Rectangle2D
方法在其所有三个实现中都可用)。这包括 return double
的 getWidth()
和 getHeight()
方法,无论特定矩形的实际存储类型如何。
将抽象提升到一个额外的,也许是多余的层次,他们还添加了 RectangularShape
作为几个具有矩形边界的形状的超级 class:Rectangle2D
、RoundRectangle2D
, Ellipse2D
和 Arc2D
。即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
)实际上有一个小优势,即使您的矩形坐标是 int
s。大乘法可能 溢出 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()
所以我昨天才开始学习 Java 来自另一种语言,我正在通读我的教科书,发现它到目前为止非常好。但是我做了一个练习,基本上要求我使用 Rectangle 创建一个新对象并找到该区域。下面是我想出的工作代码。
现在来自其他编程语言,我只是在玩弄这个并做了 int area,width,height;
然后它给了我一个错误,说我必须使用 double 才能利用 .getWidth();, .getHeight()
。我在我的书中找不到任何东西告诉我为什么我必须把它变成双倍,我开始在网上寻找并找到这个 link
现在我在网上找到了一些文档,其中告诉我也可以使用 double,但我不太确定为什么需要将它们设置为 double。是因为制作Java的人知道我们在处理坐标和计算宽度、高度和坐标时需要精度吗?我的书说制作 double
变量比 int
需要更多内存(我来自做很多 javascript 和 PHP,所以阅读 float
和 double
确实对我有好处)。
即为什么我需要使我的 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 然后使用它的字段(width
和height
)int height = rect.getSize().height;
- 使用数据type casting
int height = (int) rect.getHeight();
int height = (int) rect.getSize().getHeight();
因为在这种情况下,你不应该使用那些方法。 AWTclassRectangle
does store coordinates as int
s。如果您想这样做,您可以轻松地将它们读回 int
s,方法是访问 字段 而不是调用 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
,它们分别将坐标存储为float
s和double
s。
但是,如果您想对任何矩形进行通用处理,而不需要为所有矩形类型编写单独的代码,该怎么办?还添加了一个新的摘要class、Rectangle2D
,作为三个矩形classes 的超class。这个 class 是抽象的(这意味着它不能自己创建,因为它是不完整的)并且它本身不存储任何坐标。但是,它确实指定了其子 class 遵循的契约(这意味着任何 Rectangle2D
方法在其所有三个实现中都可用)。这包括 return double
的 getWidth()
和 getHeight()
方法,无论特定矩形的实际存储类型如何。
将抽象提升到一个额外的,也许是多余的层次,他们还添加了 RectangularShape
作为几个具有矩形边界的形状的超级 class:Rectangle2D
、RoundRectangle2D
, Ellipse2D
和 Arc2D
。即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
)实际上有一个小优势,即使您的矩形坐标是 int
s。大乘法可能 溢出 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()