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

在Java中

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

谢谢

我不倾向于用一个访问另一个对象的对象来考虑它,而是用什么代码可以访问对象中的哪些数据。

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

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

class Parent { protected int x; } class Child1 extends Parent class Child2 extends Parent class Grandchild extends Child1 

然后在Parent.x代码中,只能为已知(在编译时)作为Parent.x的对象访问Parent.x . 例如,你不能使用new Parent().xnew Child2().x

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

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

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

请注意,如果存在getName ,则实际上不需要是name字段:它完全取决于数据来自的getter的实现。

即使getter(或setter)只包含一个私有字段,拥有这些setter和getter(而不是允许直接字段访问)也是一种很好的方式。

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

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

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

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

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

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

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

摘自此链接 :

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

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

是 – getFoo()setFoo()是名为foo的“属性”的访问器方法 – 这是JavaBeans规范的一部分。 这些优先于公共字段的原因是它们允许您只有一个getter(使属性只读),执行额外的簿记(如计算派生字段)和validationset值(当值为throw时抛出例如PropertyVetoException )不能接受的)。

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

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