为什么导入 java.awt.* 不会同时导入 java.awt.geom.*?java.awt.geom 中的所有内容不都在 java.awt 中吗?从包裹的名称来看,我会假设是这样。
软件包的名称具有误导性。它们被命名为java.awt
and 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
,这意味着您必须使用访问器方法。
我希望这有帮助。