0

我有两个关于 Java 的非常基本的问题:

首先,为什么导入java.awt.* 不导入java.awt.geom.*?java.awt.geom 中的所有内容不都在 java.awt 中吗?从包裹的名称来看,我会假设是这样。

其次,我的教授告诉我对于这个矩形生成器项目,直接访问实例变量是不好的,我应该改用访问器方法。这是为什么?这只是约定吗?例如:

Rectangle rectangle = new Rectangle(1, 2, 3, 4);

int tallness = rectangle.height; //"bad"

int tallness = rectangle.getHeight(); //"good"

据我了解,这两者都是有效的并且做同样的事情。唯一的区别是前者感觉更快。

此外,为什么访问者在本网站的拼写检查器中出现拼写错误?(或者也许是 Chrome 的拼写检查器)

4

4 回答 4

1

首先,为什么导入java.awt.* 不导入java.awt.geom.*?java.awt.geom 中的所有内容不都在 java.awt 中吗?

不。

要获得所有类的包 geom 你必须写java.awt.geom.*

我的教授告诉我,对于这个矩形制造商项目,直接访问实例变量是不好的,我应该改用访问器方法。

是的,你的教授是对的。

原因是数据封装,

  • 一种语言机制,用于限制对某些对象组件的访问。
  • 一种语言结构,有助于将数据与操作该数据的方法(或其他功能)捆绑在一起。

阅读有关 封装的更多信息

于 2013-09-26T04:34:56.497 回答
0

当您编写java.awt.*时,它仅导入存在于 awt 包中的类 如果某些包存在于 awt 包中,则不会导入。 java.awt.geom在这种情况下 geom 是另一个包,所以要导入你需要做的所有类java.awt.geom.*

单击此处了解有关包裹的更多信息

于 2013-09-26T04:31:38.063 回答
0
int tallness = rectangle.height; //"bad"

int tallness = rectangle.getHeight(); //"good"

这是因为在后一种情况下,使用您的代码的其他程序员将无法通过代码为其rectangle.height分配随机值来更改 的值,就像rectangle.height= 5;您通过gettersetter方法通过声明它来封装height 变量一样。private

于 2013-09-26T04:35:15.267 回答
0

为什么导入 java.awt.* 不会同时导入 java.awt.geom.*?java.awt.geom 中的所有内容不都在 java.awt 中吗?从包裹的名称来看,我会假设是这样。

软件包的名称具有误导性。它们被命名为java.awtand java.awt.geom,但它们实际上是完全不同的包。在 Java 中并没有真正的“包层次结构”。

 import java.awt.*;

导入包内的所有java.awt。因为java.awt.geom是具有不同类的不同包,所以您也必须导入该包。分层名称主要用于组织!

直接访问实例变量很糟糕,我应该使用访问器方法。这是为什么?这只是约定吗?

Sotirios Delimanolis 关于封装的说法很好,但我相信最好的解释是,在面向对象编程中,程序员负责决定允许用户(或使用您的包的程序员)对类的成员变量。

这就是为什么制作成员变量是惯例的原因private;存储在对象中的数据是对象的责任,作为程序员,您的工作是确保通过定义的方法与该对象的接口正常工作。因此,如果您希望允许某人直接更改对象中的数据,您可以创建一个set方法来这样做。

考虑这样的事情:

 Pizza myPizza = new Pizza(18) //18-inch pizza. Yum!

当我这样做时,比萨饼将计算其他变量成员,例如numSlices(当前为 1,因为它未切割)和pizzaLeft(即 (18/2)^2 * pi 英寸)。其中哪个更有意义?

 myPizza.pizzaLeft -= 50; //50 inches of pizza eaten
 myPizza.pizzaLeft; //returns about 204.47

或者

 myPizza.slice(8); // cut into 8 pieces which are about 32 square inches each
 myPizza.eat(1); // eat one slice
 myPizza.getPizzaLeft(); //returns about 222.47

由于您正在处理比萨饼,因此将其切成薄片并吃块更有意义。Pizza 对象本身将负责计算类似pizzaLeft或类似的东西的变化slicesLeft,而那些与类交互的人看不到它。

正是由于这个原因,成员变量通常设置为private,这意味着您必须使用访问器方法。

我希望这有帮助。

于 2013-09-26T06:17:34.187 回答