【问题标题】:Importing packages and using instance variables导入包和使用实例变量
【发布时间】:2013-09-26 04:30:34
【问题描述】:

我有两个关于 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 的拼写检查器)

【问题讨论】:

    标签: java variables instance packages


    【解决方案1】:

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

    没有。

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

    我的教授在这个矩形生成器项目中告诉我,直接访问实例变量很糟糕,我应该改用访问器方法。

    是的,你的教授是正确的。

    原因是数据封装,

    • 一种语言机制,用于限制对某些对象的访问 组件。
    • 一种便于将数据与 对这些数据进行操作的方法(或其他函数)。

    阅读更多关于Encapsulation的信息

    【讨论】:

      【解决方案2】:

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

      软件包的名称具有误导性。它们被命名为java.awtjava.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 对象本身将负责计算 pizzaLeftslicesLeft 之类的变化,而与该类交互的那些则看不到它。

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

      我希望这会有所帮助。

      【讨论】:

      • 那么这是否意味着 Rectangle 类中的实例变量是公开的?
      • 如果您能够以这种方式操作它们: int tallness = rectangle.height;然后是的,他们被宣布为公开。通常这些会被设置为私有,迫使你使用: int tallness = rectangle.getHeight();
      【解决方案3】:

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

      点击here了解更多包裹信息

      【讨论】:

        【解决方案4】:
        int tallness = rectangle.height; //"bad"
        
        int tallness = rectangle.getHeight(); //"good"
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-01
          • 1970-01-01
          • 2021-02-11
          • 1970-01-01
          相关资源
          最近更新 更多