对象是否封装数据,以便即使是同一类的其他实例也无法访问数据?

时间:2009-04-27 05:55:02

标签: java encapsulation conceptual

在Java中,

对象是否封装数据,以便即使是同一类的其他实例也无法访问数据?只有在使用关键字“private”时? Java中的“访问器方法”是什么 - 像getName()这样的方法?

由于

7 个答案:

答案 0 :(得分:9)

我不倾向于用一个对象来访问另一个对象,而是代码可以访问对象中的哪些数据。< / p>

在Java(和C#,btw)中,类中的代码可以访问同一个类的任何对象的私有成员。然后你就拥有了包/程序集访问权和公共访问权。

棘手的是受保护的访问,它是对子类中代码的访问 - 但它取决于目标对象:如果它是一个对象,则只允许访问对象的受保护成员与代码位置相同类型的实例,或某个子类 - 即使它是由父类公开。例如,假设你有:

class Parent
{
    protected int x;
}

class Child1 extends Parent
class Child2 extends Parent
class Grandchild extends Child1

然后在Child1代码中,您只能访问已知(在编译时)已成为Parent.xChild1实例的对象的Grandchild。例如,您无法使用new Parent().xnew Child2().x

答案 1 :(得分:4)

不,即使从其他实例(在同一类的方法中)也可以访问私有字段。

不能从子类访问它们,但是,即使在同一个实例中也是如此。

您提供getter方法以允许“外部”代码访问您班级中的字段。由于您可以使用您提供的getter,使用它们的方式以及它们的实现方式取决于您,因此您可以对谁可以访问数据以及如何访问数据进行大量控制。

请注意,如果有name,则确实不需要getName字段:完全取决于数据来自的getter的实现。

即使getter(或setter)只是包装一个私有字段,拥有这些setter和getter(与允许直接字段访问相反)也是一种好方法。

答案 2 :(得分:1)

getName()应返回名称(字段或其他“东西”)。

答案 3 :(得分:1)

即使字段/方法是“私有”,仍然可以通过反射访问/调用它,除非您安装了不允许这样做的自定义安全管理器。

答案 4 :(得分:1)

封装的想法是允许不同单元的实现自由变化。虽然我们谈论对象,但对于封装,我们实际上是指一个代码单元。在基于类的语言中,代码单元通常是[外部]类。

如果在同一个类中没有访问权限,二进制操作(例如equals)也会变得愚蠢。私有对[outer]类是私有的,而不是同一个实例中同一个类的私有。

访问器方法通常表示除了简单的值对象(仅限getter)之外的任何设计上的错误设计。对象应该具有行为,而不仅仅是一个愚蠢的数据集合。使用getter将外部代码移动到对象上有意义的方法。亲自动手,99%的吸气剂只返回一个场值。如果要添加getter和setter,将字段设为私有的价值相对较小。

答案 5 :(得分:0)

  

Java中的“访问器方法”是什么 -   像getName()?

这样的方法

是 - getFoo()setFoo()是名为foo的“属性”的访问方法 - 这是JavaBeans规范的一部分。这些优先于公共领域的原因是它们允许你只有一个getter(使属性只读),做额外的簿记(比如计算派生字段)和验证set值(抛出例如PropertyVetoException当值不可接受时)。

最初的目的是与GUI工具一起使用,这些工​​具允许您以图形方式配置和组合JavaBeans以“构建应用程序”。事实证明,这主要是一个梦想,但JavaBeans和属性的概念已经证明对常规编码有用并且变得广泛传播。

许多人误解了这个概念,并认为“封装”只是意味着为私有财产编写制定者和吸气剂,而不是将其公之于众 - 然后理所当然地认为这是愚蠢的。封装意味着不会以严格控制的方式暴露类的内部工作。在良好的面向对象设计中,你不应该在一个类中有太多的get方法和很少的set方法。

答案 6 :(得分:0)

对象是否封装数据,以便即使是同一类的其他实例也无法访问数据?

当然,如果你没有使用静态成员。

摘自this link

有时,您希望拥有所有对象共有的变量。这是通过静态修改器完成的。在声明中具有静态修饰符的字段称为静态字段或类变量