我有两个关于Java的基本问题:
首先,为什么导入java.awt。*也不导入java.awt.geom。*? java.awt中java.awt.geom中的所有内容都不是吗?我会假设,从包的名称来判断。
其次,我的教授告诉我这个矩形制作项目的事情,直接访问实例变量是坏的,我应该使用访问器方法。这是为什么?这只是惯例吗?例如:
Rectangle rectangle = new Rectangle(1, 2, 3, 4);
int tallness = rectangle.height; //"bad"
int tallness = rectangle.getHeight(); //"good"
根据我的理解,这两个都是有效的并且做同样的事情。唯一的区别是前者感觉更快。
此外,为什么访问者在本网站的拼写检查中出现拼写错误? (或者也许是Chrome的拼写检查程序)
答案 0 :(得分:1)
首先,为什么导入java.awt。*也不导入java.awt.geom。*? java.awt中java.awt.geom中的所有内容都不是吗?
没有
要获取所有类别的包geom,您必须编写java.awt.geom.*
我的教授告诉我这个矩形制作项目的事情是直接访问实例变量是坏的,我应该使用访问器方法。
是的,你的教授是对的。
原因是数据封装,
详细了解Encapsulation
答案 1 :(得分:0)
当您编写java.awt.*
时,它只导入awt Package中存在的类
如果某些包存在于awt包中,则不会导入。
java.awt.geom
在这种情况下,geom是另一个包,因此要导入您需要执行的所有类java.awt.geom.*
点击here了解有关套餐的更多信息
答案 2 :(得分:0)
int tallness = rectangle.height; //"bad"
int tallness = rectangle.getHeight(); //"good"
这是因为在后一种情况下,使用您的代码的其他程序员将无法通过像rectangle.height
这样的代码为其分配随机值来更改rectangle.height= 5;
的值。 >通过声明private
,通过 getter 和 setter 方法封装高度变量。
答案 3 :(得分:0)
为什么导入java.awt。*也不导入 java.awt.geom中。*?不是java.awt.geom里面的所有内容 java.awt中?我会假设,从包的名称来判断。
包裹的名称具有误导性。它们的名称类似于java.awt
和java.awt.geom
,但这些名称实际上是完全不同的包。在Java中,实际上没有“包层次结构”。
import java.awt.*;
导入java.awt
包中的所有类。因为java.awt.geom
是具有不同类的不同包,所以您也必须导入该包。分层名称主要用于组织!
直接访问实例变量很糟糕,我应该这样做 请改用访问器方法。这是为什么?这只是惯例吗?
Sotirios Delimanolis关于封装的说法很好,但我相信最好的解释是在面向对象编程中,你这个程序员负责决定用户(或程序员使用你的包)是什么允许使用类的成员变量。
这就是制作成员变量private
的惯例;存储在对象中的数据是 objet的职责,作为程序员,您的工作是确保通过您定义的方法与该对象进行交互。因此,如果您希望某人允许直接更改对象中的数据,您可以使用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
由于你正在处理披萨,因此切成片并吃块更有意义。披萨对象本身将负责计算诸如pizzaLeft
之类的内容或类似slicesLeft
之类的内容的变化,而那些与该类接口的内容不会看到它。
正是由于这个原因,成员变量通常设置为private
,这意味着您必须使用访问器方法。
我希望这会有所帮助。